android-fragments 当Onclick在片段xml中运行时,应用程序崩溃

ut6juiuv  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(148)

我是开发领域的新手,我只是在尝试片段。我在一个片段XML文件中定义了一个onClick事件,但是当我单击按钮时,应用程序崩溃了。
我猜测这是因为我的onClick事件是在我的fragment中定义的,而不是在MainActivity中定义的,所以我想知道让我的按钮工作的最佳实践是什么。我是应该直接将按钮传递到我的fragment中,还是应该将onClick事件移动到MainActivity中,然后从我的fragment中引用它?


<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_weight="1.5">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_marginRight="5dp"
            android:gravity="right"
            android:layout_weight="2">

            <com.google.android.material.textfield.TextInputLayout
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                android:layout_width="150dp"
                android:id="@+id/txt_textInputLayout_three"
                android:layout_height="wrap_content"
                app:startIconDrawable="@drawable/ic_baseline_calendar_today_24">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/txt_from_user1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="From"
                    android:onClick="openDataPicker_from"
                    android:inputType="text" />

            </com.google.android.material.textfield.TextInputLayout>

        </LinearLayout>
 <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_marginLeft="5dp"
            android:gravity="left"
            android:layout_weight="2">

            <com.google.android.material.textfield.TextInputLayout
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                android:layout_width="150dp"
                android:id="@+id/txt_textInputLayout_four"
                android:layout_height="wrap_content"
                app:startIconDrawable="@drawable/ic_baseline_calendar_today_24">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/txt_to_user1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="To"
                    android:onClick="openDatePicker_to"
                    android:inputType="text" />

            </com.google.android.material.textfield.TextInputLayout>
        </LinearLayout>

    </LinearLayout>

Java文件***

public void openDatePicker_from(View view) {
        dataPickerDialog_from.show();

    }

    public void openDatePicker_to(View view) {
        dataPickerDialog_to.show();

    }

这是错误

java.lang.IllegalStateException: Could not find method openDataPicker(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.textfield.TextInputEditText with id 'txt_from_user1'
        at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:5368)
f0brbegy

f0brbegy1#

成功了,试试这个

FromDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataPickerDialog_from.show();
            }
        });

        ToDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dataPickerDialog_to.show();
            }
        });
iovurdzv

iovurdzv2#

java.lang.IllegalStateException: Could not find method openDataPicker(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.textfield.TextInputEditText with id 'txt_from_user1'
        at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:5368)

出现此错误是因为它无法在活动类中找到方法openDataPicker(View)(即使您已经将其添加到fragment类中)。
在fragment中使用android:onClick属性与在activities中使用并不完全相同;无论您是在Activity中还是在fragment中使用它,它都希望只在Activity类中看到方法openDataPicker()
Check here以查看如何在片段中使用android:onClick属性,或者您也可以正常地以编程方式使用myButton.setOnClickListener()

更新日期:

那么你能不能告诉我根据代码,我想在代码中明确改变什么
您可以在片段中使用setOnClickListener()

TextInputEditText editTextFrom = requireView().findViewById(R.id.txt_from_user1);
editTextFrom.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dataPickerDialog_from.show();
    }
});

TextInputEditText editTextTo = requireView().findViewById(R.id.txt_to_user1);
editTextTo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dataPickerDialog_to.show();
    }
});

然后从XML中删除onClick属性:

android:onClick="openDatePicker_to"

android:onClick="openDataPicker_from"

相关问题