DialogFragment - 访问布局组件的位置[即editText.setText(“”)]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DialogFragment - 访问布局组件的位置[即editText.setText(“”)]相关的知识,希望对你有一定的参考价值。

经过大量的研究和尝试(我认为)我能找到的每一种生命周期方法,我真的被卡住了:

我想要的:基本上我有这个DialogFragment(“ProfileUsernameDialogFragment”),它应该呈现我的布局文件(“fragment_profile_header_username_dialog”)。在这个布局文件中我有一些TextViews和一些EditTexts。我想将这些EditTexts的文本设置为我在程序中获得的某个值,因此无法预先设置它。

是)我有的:

public class ProfileUsernameDialogFragment extends DialogFragment {

...

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    EditText usernameText = (EditText) this.getView().findViewById(R.id.username_field);
    usernameText.setText("TEST");
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Log.d(AppController.LOG_STRING, this.getClass().toString() + " - onCreateDialog  - START");
    AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
    View view = this.getActivity().getLayoutInflater().inflate(R.layout.fragment_profile_header_username_dialog, null);
    builder.setView(view);
    builder.setPositiveButton(SAVE_SETTINGS, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int whichButton) {
            // Tried this too:
            // EditText usernameText = (EditText)
            // ProfileUsernameDialogFragment.this.getView().findViewById(R.id.forename_label);
            // usernameText.setText("TEST");
        }
    });
    builder.setNegativeButton(ABORT_ACTION, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.dismiss();
        }
    });
    builder.setTitle(CHANGE_NAME_SETTINGS);
    Dialog dialog = builder.create();
    return dialog;
}
}

我得到的:是一个NullPointerException,无论我尝试的findViewById(R.id.username_field)是哪个位置。 (我也试过onCreate和其他一些方法,我开始认为我可能有另一个问题,而不是代码位置,但我真的没有任何线索)我试图在DialogFragments中至少跟踪6个关于NullPointers的类似问题,所以我想我需要高级帮助^^

我应该添加我对android的全新,所以请保持良好,但非常欢迎会议tipps等! thx提前:)

答案

以下是您的需求:

mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {

        @Override
        public void onShow(final DialogInterface dialog) {

            final Button b = mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(final View view) {

                    v.findViewById(R.id...)
                }
            });
        }
    });
            });
        }
    });
另一答案

除了@ David的答案之外,另一个选择是使用onStart()方法。

除了使用onActivityCreated()方法之外,您的问题似乎正在考虑这些问题。

例如:

    @Override
    public void onStart() 
    {
        super.onStart();
        EditText usernameText = (EditText) this.getDialog().findViewById(R.id.username_field);
        usernameText.setText("TEST");
    }
另一答案

Android文档有很好的example

所以,如果你不在你的布局中设置文本你需要在onCreateView()方法中设置它,例如:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup cont,
                         Bundle savedInstanceState) {
    // Inflate the layout to use as dialog or embedded fragment
    View view = inflater.inflate(R.layout.app_info, cont, false);
    TextView title = (TextView)view.findViewById(R.id.dialog_header);
    TextView content = (TextView)view.findViewById(R.id.dialog_content);
    Button button = (Button)view.findViewById(R.id.dialog_button);

    title.setText(this.dialogTitle);
    content.setText(this.dialogContent);

    button.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            getDialog().dismiss();
        }
    });

    return view;
}

以上是关于DialogFragment - 访问布局组件的位置[即editText.setText(“”)]的主要内容,如果未能解决你的问题,请参考以下文章

DialogFragment OnCreateView与OnCreateDialog的自定义布局

DialogFragment OnCreateView 与 OnCreateDialog 的自定义布局

DialogFragment 中的 Kotlin 合成和自定义布局

使用 DialogFragment 从布局 xml 调用方法。它是如何工作的?

java 如果您想让DialogFragment具有嵌入能力,则必须在布局中定义对话框的UI,然后在onCreateView()回调中加载布局。

java 如果您想让DialogFragment具有嵌入能力,则必须在布局中定义对话框的UI,然后在onCreateView()回调中加载布局。