【问题标题】:Android app crashing (fragment and xml onclick)Android 应用程序崩溃(片段和 xml onclick)
【发布时间】:2012-12-17 20:47:35
【问题描述】:

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

【问题讨论】:

  • 请发布 LogCat 以便我们查看崩溃情况
  • 您可以尝试从您的onCreateView 函数内部将OnClickListener 设置为您的按钮吗?据我所知,来自 xml 的onClick 将尝试在活动中而不是在片段中找到该函数。
  • 发布您的 logcat 输出 ..以便我们了解问题
  • 你的activity是否真的实现了FragmentInterface接口?

标签: android android-fragments


【解决方案1】:

活动:

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

片段:

但是,当您拥有 Fragment 时,如果您想通过定义 android:onClick 属性来定义点击监听器,那么您必须在调用 Fragment 的实际活动中定义一个具有相同名称的方法。

或者您可以简单地以编程方式实现点击监听器。

【讨论】:

    【解决方案2】:

    以编程方式(而不是通过 XML)设置 onClickListener 可以省去很多麻烦。这应该可以帮助您做您想做的事情:

    @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 变体。有些方法有效,有些找不到。刚回到听众那里,一切正常
    【解决方案3】:

    如果您在.xml 中定义onClick="button",您需要在调用片段的Activity 中定义一个名为public void button(View v) 的方法,而不是在片段本身中。

    public class MainActivity extends FragmentActivity{
    
    ...
    
      public void button(View v){
        ...
      }
    
    ...
    
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这一直为我工作:(Android工作室)

         @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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 2014-06-05
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 2023-04-04
          相关资源
          最近更新 更多