#java #android #mobile #layout #crop
#java #Android #Мобильный #макет #обрезка
Вопрос:
Я довольно новичок в Android Studio, так что это может быть простым решением (я надеюсь).
Я получил этот подробный вид элемента, но даже при том, что ширина и высота макета установлены в «match_parent», он не подходит для экрана моего телефона. Не имеет значения, какой макет или .xml я использую, он все равно обрезан (линейный, относительный, ограниченный), поэтому я предполагаю, что это что-то в коде.
И вот код, в котором, я думаю, проблема:
public class RecyclerViewAdapterBiography extends RecyclerView.Adapter < RecyclerViewAdapterBiography.MyViewHolder > {
private Context myContext;
private List < TimeStamp > myData;
private Dialog myDialog;
public RecyclerViewAdapterBiography(Context myContext, List < TimeStamp > myData) {
this.myContext = myContext;
this.myData = myData;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
v = LayoutInflater.from(myContext).inflate(R.layout.biography_item, parent, false);
final MyViewHolder viewHolder = new MyViewHolder(v);
// Detail View of the Biography TimeStamps
// makes the background of the dialog box transparent
// myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// OnClickListener for the different Items in the View (to see the detail view)
viewHolder.biography_item_id.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDialog = new Dialog(myContext);
myDialog.setContentView(R.layout.biography_detail);
TextView tv_dialog_title = (TextView) myDialog.findViewById(R.id.bio_details_title);
TextView tv_dialog_text = (TextView) myDialog.findViewById(R.id.bio_details_desc);
tv_dialog_title.setText(myData.get(viewHolder.getAdapterPosition()).getTitle());
tv_dialog_text.setText(myData.get(viewHolder.getAdapterPosition()).getDialog());
/*
Toast.makeText(myContext,"Test Click" String.valueOf
(viewHolder.getAdapterPosition()), Toast.LENGTH_SHORT).show();
*/
myDialog.show();
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv_year.setText(myData.get(position).getYear());
holder.tv_title.setText(myData.get(position).getTitle());
}
@Override
public int getItemCount() {
return myData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
private LinearLayout biography_item_id;
private TextView tv_year;
private TextView tv_title;
public MyViewHolder(View itemView) {
super(itemView);
biography_item_id = (LinearLayout) itemView.findViewById(R.id.biography_item_id);
tv_year = (TextView) itemView.findViewById(R.id.biography_year);
tv_title = (TextView) itemView.findViewById(R.id.biography_title);
}
}
}
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fcfcfc">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="125dp"
android:layout_height="175dp"
android:background="#2d2d2d"
android:id="@ id/item_biography_img"
android:scaleType="centerCrop"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:id="@ id/bio_details_title"
android:textStyle="bold"
android:textSize="24sp"
android:layout_marginTop="10dp"/>
<TextView
android:id="@ id/bio_details_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginTop="10dp"
android:text="Description" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
Я в принципе перепробовал все, и rn я просто a / b с материалом, который я нашел в Интернете, чтобы решить эту проблему, но я не могу найти никакого решения
Ответ №1:
Dialog
s предназначены для того, чтобы быть такими — они появляются поверх содержимого вашего приложения, занимают только часть экрана, и вы не можете взаимодействовать с остальной частью приложения, когда они отображаются.
Лучше всего взглянуть на документы — как будто там сказано, что на самом деле вы не собираетесь использовать Dialog
класс напрямую, обычным способом является использование AlertDialog.Builder
и вызов методов настройки для определения заголовка, кнопок и т.д. Одним из методов является setView(), с помощью которого вы можете поместить туда пользовательский макет, который вы можете получить, предварительно увеличив макет:
view = activity.layoutInflater.inflate(R.layout.biography_detail, null)
Диалоги имеют свой собственный макет со всеми закругленными углами, затенением и тому подобным, поэтому, когда вы просто делаете setContentView
, вы заменяете весь этот стиль, а вы обычно этого не хотите!
Если вам не нужен этот стиль или вы хотите больше контроля (например, сделать его полноэкранным), тогда вам следует создать DialogFragment
— здесь есть хорошее руководство (лично я думаю, что этот сайт действительно полезен для обзоров тем)
В полноэкранных диалоговых окнах ближе к концу есть кое-что — в основном a DialogFragment
работает как a Fragment
, за исключением того, что вы реализуете onCreateDialog
метод вместо onCreate
, и именно там вы настраиваете Dialog
созданный для вас системой. Когда вы хотите его отобразить, вы создаете экземпляр и используете FragmentManager
для его отображения. Первый пример в ссылке объясняет это, поэтому я не буду вставлять его сюда!