2015-08-23 28 views
0

其实我正在用滑动选项卡制作应用程序。下载了滑动标签的代码。它有3个片段和MainActivity,它扩展了FragmentActivity,并使用viewpager。滑动标签工作正常。现在我正在尝试在其中一个片段中添加一个按钮,并在点击该按钮时显示敬酒。下面是我在XML文件中添加的片段代码:按钮单击不起作用的片段

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

    <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Design Top Rated Screen" 
     android:textSize="20dp" 
     android:layout_centerInParent="true"/> 

    <Button 
     android:id="@+id/btn_frgmnt" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Go to actvity" 
     android:onClick="navToActivity" 
     /> 
</RelativeLayout> 

而对于这个片段java文件里面我做:

public class TopRatedFragment extends Fragment 
{ 

    Button btnNav; 

     Context context; 

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

     View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false); 
     btnNav = (Button)rootView.findViewById(R.id.btn_frgmnt); 

     return rootView; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 

     super.onCreate(savedInstanceState); 
     //btnNav = (Button)rootView.findViewById(R.id.btn_frgmnt); 
     context = getActivity().getApplicationContext(); 

    } 


    public void navToActivity(View v) 
    { 
     Toast.makeText(getActivity().getApplicationContext(), "Clicked inside fragment!", 2000).show(); 
    } 
} 

但其显示的错误!我哪里错了。或者做点什么来使按钮点击工作。它的这个片段类,我应该编写按钮点击的代码,对吧?

08-23 11:58:31.385: E/AndroidRuntime(3033): FATAL EXCEPTION: main 
    08-23 11:58:31.385: E/AndroidRuntime(3033): Process: info.androidhive.tabsswipe, PID: 3033 
    08-23 11:58:31.385: E/AndroidRuntime(3033): java.lang.IllegalStateException: Could not find a method navToActivity(View) in the activity class info.androidhive.tabsswipe.MainActivity for onClick handler on view class android.widget.Button with id 'btn_frgmnt' 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.view.View$1.onClick(View.java:3810) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.view.View.performClick(View.java:4438) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.view.View$PerformClick.run(View.java:18422) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.os.Handler.handleCallback(Handler.java:733) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.os.Handler.dispatchMessage(Handler.java:95) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.os.Looper.loop(Looper.java:136) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.app.ActivityThread.main(ActivityThread.java:5001) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at java.lang.reflect.Method.invokeNative(Native Method) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at java.lang.reflect.Method.invoke(Method.java:515) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at dalvik.system.NativeStart.main(Native Method) 
    08-23 11:58:31.385: E/AndroidRuntime(3033): Caused by: java.lang.NoSuchMethodException: navToActivity [class android.view.View] 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at java.lang.Class.getConstructorOrMethod(Class.java:472) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at java.lang.Class.getMethod(Class.java:857) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  at android.view.View$1.onClick(View.java:3803) 
    08-23 11:58:31.385: E/AndroidRuntime(3033):  ... 11 more 
+1

[onClick on fragment on called on Activity]的可能重复(http://stackoverflow.com/questions/7570575/onclick-inside-fragment-called-on-activity) – Simas

回答

0

在xml文件中声明单击事件的按钮的回调函数必须位于您的活动类中。所以你必须在你的xml中声明回调函数,否则你会得到一个异常。

要获得click事件在你的片段,你需要调用“navToActivity的方法在你的片段explicitly.So在你的活动添加同样的方法,并调用从按钮单击回调的片段法活动

public void navToActivity(View v) 
    { 
     topRatedFragment.navToActivity(v); 
    } 
+0

谢谢。但是,如果我没有在xml文件中为fragment定义方法,在哪里初始化按钮并编写按钮clickListener的代码? –

+0

不要混淆。初始化部分将在您的片段中完成..但点击回调将进入活动.. – Prasad

2

为了捕捉按钮事件片段使用的片段XML的查看或者干脆注册回调是这样的:

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

     View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false); 
     btnNav = (Button)rootView.findViewById(R.id.btn_frgmnt); 

     btnNav.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Action to be performed on button click 
      } 
     }); 

     return rootView; 
    } 
0

注意,上面的XML,Android将查找我的onClick只在当前Activity中使用navToActivity()。如果您使用片段,这一点很重要,因为即使使用片段添加上面的XML,Android也不会在用于添加XML的片段的.java文件中查找onClick方法。