繁体   English   中英

DialogFragment:中央视图的恒定高度

[英]DialogFragment: constant height of the central view

我有一个 DialogFragment,它由三部分组成,从上到下:标题、显示所有内容的中央视图和包含 PositiveButton“OK”的底部窗格:

public Dialog onCreateDialog(Bundle savedInstanceState)
{
FragmentActivity act = getActivity();
LayoutInflater inflater = act.getLayoutInflater();
AlertDialog.Builder builder = new AlertDialog.Builder(act);

// TITLE:
TextView title = (TextView) inflater.inflate(R.layout.dialog_title, null);
title.setText(R.string.updates);
builder.setCustomTitle(title);

// CENTRAL VIEW:
View view = inflater.inflate(R.layout.dialog_updates, null);
// ... customize it ... 
builder.setView(view);

// POSITIVE BUTTON:
builder.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener()
  {
  @Override
  public void onClick(DialogInterface dialog, int which)
    {
    // something
    }
  });
}

中央视图显示的内容是从 web 下载的。 最初,当用户弹出对话框时,视图只显示“正在下载...”消息:

在此处输入图像描述

当我们得到答案时,我们创建一个 ScrollView 并继续向它添加垂直可滚动的窗格,如下所示:

在此处输入图像描述

(上图显示了到目前为止添加的三个这样的窗格)

结果是对话框的高度不断变化,在视觉上令人不快。 所以我真的想保持整个Dialog的高度不变,比如说固定到屏幕高度的3/4。 那么让我们这样做:

public void onResume()
{
super.onResume();

Window window = getDialog().getWindow();
Context context = getContext();

if( window!=null && context!=null )
  {
  DisplayMetrics metrics = context.getResources().getDisplayMetrics();
  final float height= metrics.heightPixels;

  WindowManager.LayoutParams params = window.getAttributes();
  params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  params.height = (int)(0.75f*height);
  window.setAttributes(params);
  }
}

结果:

在此处输入图像描述

正如您所看到的,这确实有效 - 它通过使用“确定”按钮而不是中央视图放大下部窗格来工作。

如何解决这个问题?

编辑:这是我的 dialog_title.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:textSize="20sp"
  android:gravity="center"
  android:padding="10dp"/>

此问题的一种解决方法是对整个对话框使用ConstrainedLayout ,如下所示:

片段对话框布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical">

   <TextView
      android:id="@+id/title"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:padding="10dp"
      android:text="Updates"
      android:textSize="20sp"
      app:layout_constraintTop_toTopOf="parent" />

   <TextView
      android:id="@+id/central_view"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:text="Downloading"
      app:layout_constrainedHeight="true"
      app:layout_constraintBottom_toTopOf="@id/positive_action"
      app:layout_constraintHeight_percent="0.8"
      app:layout_constraintTop_toBottomOf="@id/title" />

   <androidx.appcompat.widget.AppCompatButton
      android:id="@+id/positive_action"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="end"
      android:layout_margin="8dp"
      android:text="OK"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

您可以使用app:layout_constraintHeight_percent="0.8"更改中心视图的百分比

对话片段class

public class LoadingDialog extends DialogFragment {

   @NonNull
   @Override
   public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
      FragmentActivity act = getActivity();
      LayoutInflater inflater = act.getLayoutInflater();
      View view = inflater.inflate(R.layout.fragment_dialog, null);
      AlertDialog.Builder builder = new AlertDialog.Builder(act).setView(view);

      // POSITIVE BUTTON:
      view.findViewById(R.id.positive_action).setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View v) {
            //something
         }
      });

      return builder.create();
   }

   @Override
   public void onResume() {
      super.onResume();
      getDialog().getWindow().setLayout(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
      );
   }
}

你会得到这个结果:

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM