【问题标题】:View element of a DialogFragment layout is not accessible by idDialogFragment 布局的视图元素无法通过 id 访问
【发布时间】:2016-06-18 13:53:45
【问题描述】:

我有一个自定义 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);
        }
    }

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

无论如何都可以访问该元素。

【问题讨论】:

  • 你想做什么?为什么你在 ondismiss 中访问它
  • 我长按地图标记的 InfoWindow 并打开一个具有 EditText 元素的 DialogFragment。我不想有任何提交按钮。一旦用户关闭对话框,就会在 InfoWindow 中设置文本。

标签: android android-dialogfragment android-library dialogfragment


【解决方案1】:

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

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

不要忘记转换为您正在使用的适当类型的 Dialog,但通常 Dialog 应该可以解决。

【讨论】:

  • 它不会起作用,因为 R.id.remainder 即将为 0,
【解决方案2】:

方法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();

【讨论】:

  • 它不会工作,因为 R.id.remainder 即将变为 0
【解决方案3】:

尝试使用 getDialog().findViewById() 代替 rootView.findViewById(R.id.reminder)

**

编辑

**

尝试使用

Resources.getIdentifier(...)

你可以的

getResources().getIdentifier("res_name", "res_type", "com.library.package");

在你的情况下:

R.id.reminder 将是:

getResources().getIdentifier("reminder", "id", "com.library.package");

【讨论】:

  • getDialog() 返回 null
  • 它不会工作,因为 R.id.remainder 即将变为 0
  • 尝试使用Resources.getIdentifier(...) 你可以这样做 getResources().getIdentifier("res_name", "res_type", "com.library.package");在您的情况下: R.id.reminder 将是: getResources().getIdentifier("reminder", "id", "com.library.package");
  • 检查你的 R.class 的导入,也许你的 R 是从你的库中导入的
  • 嗨 Ognev,我查过了。但这不是问题。你能看一下代码吗?如果你不介意的话,我可以用邮件发给你。请通过 kuldeep5534@gmail.com 给我发送空消息谢谢,
【解决方案4】:

我还检查了您的解决方案。视图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) 在 java.lang.reflect.Method.invoke(本机方法) 在 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);
    }
}

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多