使用setView(int layoutResId)时如何从AlertDialog获取膨胀视图?

时间:2019-02-26 06:00:18

标签: android android-alertdialog android-dialog

我使用以下代码创建自定义AlertDialog:

val dialog = AlertDialog.Builder(context)
            .setView(R.layout.layout)
            .create()

问题是我无法获得膨胀的视图。 dialog.findViewById(R.id.a_view_in_the_layout)返回null。

或者,我可以使用.setView(View.inflate(context, R.layout.layout, null),但这有时会使对话框充满屏幕,并且比setView(int layoutResId)占用更多空间。

4 个答案:

答案 0 :(得分:2)

使用alert dialog而不是simple Dialog既简单又非常简单

final Dialog dialog = new Dialog(context);
        dialog.setContentView((R.layout.layout);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

        TextView tvTitle = (TextView) dialog.findViewById(R.id.tvTitle);
        tvTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

您不必为视图充气。

答案 1 :(得分:1)

如果我没记错的话,create设置了对话框,但是它的布局在需要显示之前不会膨胀。然后先尝试致电show,然后查找所需的视图。

val dialog = AlertDialog.Builder(context)
            .setView(R.layout.layout)
            .create()

dialog.show() // Cause internal layout to inflate views
dialog.findViewById(...)

答案 2 :(得分:0)

只需自己增加布局(它的Java代码,但我想您知道该怎么做):

AlertDialog.Builder dialog = new AlertDialog.Builder(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE );
View view = inflater.inflate( R.layout.layout, null );
dialog.setView(view);
dialog.create().show();

您的展开视图现在为view,您可以使用它在其中查找其他视图,例如:

EditText editText = view.findViewById(R.id.myEdittext);

答案 3 :(得分:0)

尝试一下;

View dialogView; //define this as a gobal field

dialogView = LayoutInflater.from(context).inflate(R.layout.your_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Title");
builder.setView(dialogView);

View yourView = dialogView.findViewById(R.id.a_view_in_the_layout);
TextView yourTextView = dialogView.findViewById(R.id.a_textView_in_the_layout);
Button yourButton = dialogView.findViewById(R.id.a_button_in_the_layout);