gpt4 book ai didi

java - 我应该如何确保 onCreate(View/Dialog) 已完成运行,以便一切都正确初始化?

转载 作者:行者123 更新时间:2023-12-01 10:18:49 25 4
gpt4 key购买 nike

回答

答案/示例可以在本文底部找到。这个答案的达成方式可以在这个answer中找到。及其评论。

<小时/>

原始问题

我有一个dialogFragment ,其中有两个 editText输入字段。在特定按钮上单击,我想要这个 dialogFragment待创建,两个 editText要填充文本的字段。为此,我在 dialogFragment 中创建了一个简单的方法。的类(class)。

public void presetFields(String nameField, String tagField) {
nameInputField.setText(nameField);
tagInputField.setText(tagField);
}

问题是,nameInputFieldtagInputFieldonCreateDialog内进行初始化方法。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
final View v_iew = inflater.inflate(R.layout.fragment_inputdialog, null);

nameInputField = (EditText) v_iew.findViewById(R.id.inputdialogname);
tagInputField = (EditText) v_iew.findViewById(R.id.inputdialogtag);
}

我认为这根本不是问题,因为我有一个类似的构造在运行 fragment 。唯一的区别是editTextonCreateView 中初始化而不是onCreateDialog .

这是onClick显示 dialogFragment 的代码并调用该方法来设置 nameInputFieldtagInputField字段。

editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stuffManagerInputDialogFragment.show(getFragmentManager(), "TEST");
stuffManagerInputDialogFragment.presetFields(nameTextViewContent, tagTextViewContent);
}
});

当我点击editButton时,这是我通过 NPE 得到的日志

03-02 16:04:25.120 509-509/com.example.tim.timapp I/art: Not late-enabling -Xcheck:jni (already on)
03-02 16:04:25.190 509-509/com.example.tim.timapp W/System: ClassLoader referenced unknown path: /data/app/com.example.tim.timapp-2/lib/x86_64
03-02 16:04:25.400 509-524/com.example.tim.timapp D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
03-02 16:04:25.520 509-524/com.example.tim.timapp I/OpenGLRenderer: Initialized EGL, version 1.4
03-02 16:04:25.570 509-524/com.example.tim.timapp W/EGL_emulation: eglSurfaceAttrib not implemented
03-02 16:04:25.570 509-524/com.example.tim.timapp W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x7fceb5b27dc0, error=EGL_SUCCESS
03-02 16:04:28.660 509-509/com.example.tim.timapp D/TEST: 2131493026
03-02 16:04:30.310 509-509/com.example.tim.timapp D/AndroidRuntime: Shutting down VM
03-02 16:04:30.310 509-509/com.example.tim.timapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tim.timapp, PID: 509
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
at com.example.fragments.MainFragments.DialogFragments.StuffManagerInputDialogFragment.presetFields(StuffManagerInputDialogFragment.java:149)
at com.example.fragments.MainFragments.VariableFragments.StuffManagerVariableFragment$2.onClick(StuffManagerVariableFragment.java:87)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-02 16:04:33.140 509-509/com.example.tim.timapp I/Process: Sending signal. PID: 509 SIG: 9

到目前为止我还不是专家,但我对这个错误的看法是nameTextViewtagTextViewnull目前我正在尝试为它们设置文本,这让我认为该方法在创建 fragment 之前被调用。

我如何确保 editText在我尝试调用它之前是否已正确初始化?

为了便于阅读,我删除了一些代码。如果看起来缺少某些东西,那么它很可能确实缺少。请告诉我,以便我添加。
如果您需要更多代码,也请告诉我。

<小时/>

完整答案

所有积分均转到 George Mulligan对于这个。

所以有些东西比原来的方法发生了变化。首先,presetFields方法已被删除。应填充 editText 的文本字段现在作为参数传递给 fragment 。

onClick方法现在看起来像这样:

editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nameTextViewContent = nameTextView.getText().toString();
tagTextViewContent = tagTextView.getText().toString();

Bundle args = new Bundle();
args.putString("name", nameTextViewContent);
args.putString("tag", tagTextViewContent);
stuffManagerInputDialogFragment.setArguments(args);
stuffManagerInputDialogFragment.show(getFragmentManager(), "TEST");
}
});

所以没有presetFields方法中,我们没有办法设置 editText字段到我们想要的文本。这已添加到 onCreateDialog方法,如下所示。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
final View v_iew = inflater.inflate(R.layout.fragment_inputdialog, null);

nameInputField = (EditText) v_iew.findViewById(R.id.inputdialogname);
tagInputField = (EditText) v_iew.findViewById(R.id.inputdialogtag);

if (getArguments() != null) {
nameInputField.setText(getArguments().getString("name"));
tagInputField.setText(getArguments().getString("tag"));
}
}

getArguments() 的空检查添加是因为我有时需要调用此 dialogFragment无需填写editText字段。发生这种情况时,意味着没有为该 fragment 设置任何参数,这将在调用getArguments().getString("String");时导致NPE。

应该是这样。然而,我确实以愚蠢而闻名,所以我很可能忽略了一些应该包含在这个解释中的东西。如果有,请告诉我,以便我添加。

最佳答案

What I make of this error, is that nameTextView and tagTextView are null at the moment that I'm trying to set text to them, which makes me think the method gets called before the fragment is created.

这几乎是正确的。 Fragment 已创建,但尚未调用 onCreateDialog(),因为显示对话框是在调用 show(...) 之后异步发生的.

您可以通过将两个预设字符串添加为 arguments 来解决此问题到 DialogFragment

然后,您可以在 onCreateDialog 方法中使用 DialogFragment 上的 getArguments() 直接为 EditText 字段分配正确的值.

这是这样的:

public MyDialogFragment extends DialogFragment {
private static final String ARG_NAME = "name";
private static final String ARG_TAG = "tag";
public MyDialogFragment newInstance(String name, String tag) {
Bundle args = new Bundle();
args.putString(ARG_NAME, name);
args.putString(ARG_TAG, tag);

MyDialogFragment frag = new MyDialogFragment();
frag.setArguments(args);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
final View v_iew = inflater.inflate(R.layout.fragment_inputdialog, null);

nameInputField = (EditText) v_iew.findViewById(R.id.inputdialogname);
tagInputField = (EditText) v_iew.findViewById(R.id.inputdialogtag);

nameInputField.setText(getArguments().getString(ARG_NAME, ""));
tagInputField.setText(getArguments().getString(ARG_TAG, ""));
}
}

然后是新的点击事件处理程序。

editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stuffManagerInputDialogFragment = MyDialogFragment
.newInstance(nameTextViewContent, tagTextViewContent);

stuffManagerInputDialogFragment.show(getFragmentManager(), "TEST");
}
});

关于java - 我应该如何确保 onCreate(View/Dialog) 已完成运行,以便一切都正确初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35751378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com