安卓应用崩溃(碎片和XML onclick)

23

second_fragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/f2_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/f2_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/f2_tv" />

<Button
    android:id="@+id/f2_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="button"
    android:text="@string/f2_bttn" />

SecondFragment.java

   public class SecondFragment extends Fragment {

    FragmentInterface iface;

    public interface FragmentInterface {
        public void buttonPressed();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return inflater.inflate(R.layout.second_fragment, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            iface = (FragmentInterface) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement FragmentInterface");
        }

    }

    public void button(View view) {

    }
}

我是新手,当我按下按钮时,我的应用程序崩溃了,我不知道为什么?有人可以解释一下吗?

01-03 13:28:25.612: E/AndroidRuntime(1276): FATAL EXCEPTION: main
01-03 13:28:25.612: E/AndroidRuntime(1276): java.lang.IllegalStateException: Could not find a method button(View) in the activity class com.sp.fragments.MainActivity for onClick handler on view class android.widget.Button with id 'f2_button' 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$1.onClick(View.java:3584) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View.performClick(View.java:4202) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$PerformClick.run(View.java:17340) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Handler.handleCallback(Handler.java:725) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.os.Looper.loop(Looper.java:137) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.app.ActivityThread.main(ActivityThread.java:5039) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.reflect.Method.invokeNative(Native Method) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.reflect.Method.invoke(Method.java:511) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at dalvik.system.NativeStart.main(Native Method) 
01-03 13:28:25.612: E/AndroidRuntime(1276): Caused by: java.lang.NoSuchMethodException: button [class android.view.View] 
01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.Class.getConstructorOrMethod(Class.java:460) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at java.lang.Class.getMethod(Class.java:915) 
01-03 13:28:25.612: E/AndroidRuntime(1276): at android.view.View$1.onClick(View.java:3577) 
01-03 13:28:25.612: E/AndroidRuntime(1276): ... 11 more 
01-03 13:28:27.563: I/Process(1276): Sending signal. PID: 1276 SIG: 9

2
请发布LogCat以便我们查看崩溃信息。 - David M
你可以尝试在onCreateView函数内部为你的按钮设置OnClickListener吗?据我所知,从xml中设置的onClick会尝试在活动中查找该函数而不是片段。 - Sudarshan Bhat
请发布您的logcat输出,这样我们就能了解问题所在。 - Janmejoy
你的Activity是否实现了FragmentInterface接口? - dmon
5个回答

59

活动:

如果您有一个活动,并在XML中定义了android:onClick属性,则只需要在活动中定义一个同名的方法。

片段:

但是,如果您有一个片段,并且希望通过仅定义android:onClick属性来定义单击侦听器,则必须在调用片段的实际活动中定义一个具有相同名称的方法。

或者,您可以通过编程方式简单地实现单击侦听器。


11

通过以编程方式设置onClickListener(而不是通过XML)可以节省很多麻烦。这应该有助于您完成您要做的事情:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.second_fragment, container, false);
    final View button = view.findViewById(R.id.f2_button);
    button.setOnClickListener(
        new OnClickListener() {
            @Override
            public void onClick(View v) {
                /* DO SOMETHING UPON THE CLICK */
            }
        }
    );
    return view;
}

我也使用了XML变体。有些方法可以正常工作,有些找不到。最终回到监听器,一切都正常工作。 - Marian Klühspies

5
如果您在xml文件中定义了“onClick =“button””,则需要在调用片段的 Activity 中定义一个名为public void button(View v)的方法,而不是在片段本身中定义。
public class MainActivity extends FragmentActivity{

...

  public void button(View v){
    ...
  }

...

}

1
这对我来说一直有效:(Android Studio)
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.update_credential, container, false);
        Button bt_login = (Button) rootView.findViewById(R.id.btnSend);

        bt_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                System.out.println("Hi its me");


            }// end onClick
        });

        return rootView;

    }// end onCreateView

1

你的方法按钮必须在MainActivity类中定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接