id无法访问DialogFragment布局的View元素

时间:2016-06-18 13:53:45

标签: android android-dialogfragment android-library dialogfragment

我有一个自定义的DialogFragment,其布局只包含一个EditText元素。

布局:

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/reminder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/reminder_message"
        android:inputType="text" />
</LinearLayout>

代码:

public class ReminderDialog extends DialogFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_reminder, container, false);
        return rootView;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (onDismissListener != null) {
        String text = (String) ((TextView) (rootView.findViewById(R.id.reminder))).getText();
        onDismissListener.onDismiss(text);
        }
    }

它在app模块中运行良好。但我想进入图书馆模块。但后来我调试了错误,这是因为 R.id.reminder是0。

无论如何都要访问该元素。

4 个答案:

答案 0 :(得分:0)

尝试使用getDialog()。findViewById()而不是rootView.findViewById(R.id.reminder)

**

  

修改

**

尝试使用

Resources.getIdentifier(...)

你可以做到

getResources()。getIdentifier(“res_name”,“res_type”,“com.library.package”);

在你的情况下:

R.id.reminder将是:

getResources()。getIdentifier(“提醒”,“id”,“com.library.package”);

答案 1 :(得分:0)

尝试转换提供的Dialog实例,然后找到视图:

((Dialog) dialog).findViewById(R.id.reminder); 

不要忘记使用你正在使用的相应类型的Dialog,但总的来说Dialog应该可以解决。

答案 2 :(得分:0)

方法onCreateView对DialogFragments没用 你应该覆盖:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(), null);
    dialog.setContentView(R.layout.fragment_reminder);
    return dialog;
}

然后,正如Ognev Zair指出的那样,你可以使用getDialog()

String text = (TextView) (getDialog().findViewById(R.id.reminder))).getText().toString();

答案 3 :(得分:0)

我也检查了你的解决方案。视图ID没有任何问题!如果它在那里它与您的本地设置有关。所以请运行:

gradlew clean 

然后再次构建项目。 我得到的唯一错误与你在检索文本输入时所做的错误演员有关:

  

06-19 10:38:29.602 7974-7974 / com.palup.locationalert E / AndroidRuntime:   致命异议:主要                                                                          处理:com.palup.locationalert,PID:7974                                                                          java.lang.ClassCastException:android.text.SpannableStringBuilder   无法强制转换为java.lang.String                                                                              在   com.palup.library.fragment.ReminderDialog.onDismiss(ReminderDialog.java:47)                                                                              在android.app.Dialog $ ListenersHandler.handleMessage(Dialog.java:1323)                                                                              在android.os.Handler.dispatchMessage(Handler.java:102)                                                                              在android.os.Looper.loop(Looper.java:148)                                                                              在android.app.ActivityThread.main(ActivityThread.java:5417)                                                                              at java.lang.reflect.Method.invoke(Native Method)                                                                              在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)                                                                              在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

所以只需在ReminderDialog中更新您的代码:

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    if (onDismissListener != null) {
        String text = ((EditText) (rootView.findViewById(R.id.reminder))).getText().toString();
        onDismissListener.onDismiss(text);
    }
}