2015-03-03 110 views
23

它拋出一個錯誤,說我必須暗示OnFragmentInteractionListener,但據我所知我正在實施它......任何幫助將不勝感激。錯誤:必須實現OnFragmentInteractionListener

主要活動

import android.app.Activity; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 


public class MainActivity extends Activity implements NavFragment.OnFragmentInteractionListener, ContentFragment.OnFragmentInteractionListener{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.nav, new NavFragment()); 
     fragmentTransaction.commit(); 

     fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.content, new ContentFragment()); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    public void onNavFragmentInteraction(String string) { 
     Bundle args = new Bundle(); 
     args.putString("string", string); 
     ContentFragment content = new ContentFragment(); 
     content.setArguments(args); 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

    @Override 
    public void onContentFragmentInteraction(String string){ 

    } 

} 

NavFragment

import android.app.Activity; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 

public class NavFragment extends Fragment implements View.OnClickListener { 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 
    private String mParam1; 
    private String mParam2; 
    private Button button; 
    private OnFragmentInteractionListener mListener; 

    public static NavFragment newInstance(String param1, String param2) { 
     NavFragment fragment = new NavFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public NavFragment() { 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

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

     View v = inflater.inflate(R.layout.fragment_nav, container, false); 

     button = (Button) v.findViewById(R.id.submit); 
     button.setOnClickListener(this); 

     return v; 
    } 

    public void onButtonPressed(String string) { 

    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    @Override 
    public void onClick(View v) { 
     String string = ((EditText) v.findViewById(R.id.gridSize)).toString(); 
     mListener.onNavFragmentInteraction(string); 
    } 

    public interface OnFragmentInteractionListener { 
     public void onNavFragmentInteraction(String string); 
    } 

} 

ContentFragment

import android.app.Activity; 
import android.app.Fragment; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.GridView; 


public class ContentFragment extends Fragment { 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 
    private String mParam1; 
    private String mParam2; 
    private OnFragmentInteractionListener mListener; 

    public static ContentFragment newInstance(String param1, String param2) { 
     ContentFragment fragment = new ContentFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public ContentFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

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

     View v = inflater.inflate(R.layout.fragment_content_fragmet, container, false); 

     String string = "1"; 

     if (getArguments() != null) { 
      Bundle args = getArguments(); 
      string = (String) args.get("string"); 
     } 
     GridView gridView = (GridView) v.findViewById(R.id.gridview); 

     gridView.setNumColumns(Integer.parseInt(string)); 
     gridView.setAdapter(new GridAdapter(this, Integer.parseInt(string))); 

     return v; 
    } 

    public void onButtonPressed(Uri uri) { 

    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnFragmentInteractionListener { 
     public void onContentFragmentInteraction(String string); 
    } 
} 

錯誤

03-02 18:46:47.254 1958-1958/com.peterchappy.lab5 E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.peterchappy.lab5, PID: 1958 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.peterchappy.lab5/com.peterchappy.lab5.MainActivity}: java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener 
     at com.peterchappy.lab5.ContentFragmet.onAttach(ContentFragmet.java:83) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:853) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
     at android.app.BackStackRecord.run(BackStackRecord.java:833) 
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 
     at android.app.Activity.performStart(Activity.java:5948) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

回答

36

Fragment中的OnFragmentInteractionListener接口包含一個具有相同簽名的方法,並且MainActivity正在實現一種嘗試覆蓋這兩個接口的方法。

更改一個或兩個方法的簽名,然後在MainActivity中實施這兩種方法。例如:

NavFragment

public interface OnFragmentInteractionListener { 
     public void onNavFragmentInteraction(String string); 
    } 

ContentFragment

public interface OnFragmentInteractionListener { 
     public void onContentFragmentInteraction(String string); 
    } 

MainActivity

@Override 
    public void onNavFragmentInteraction(String string) { 
     // Do stuff 
    } 

    @Override 
    public void onContentFragmentInteraction(String string) { 
     // Do different stuff 
    } 
+1

所以,如果我想更簡單[R從ContentFragment中刪除接口,然後刪除ActivityMain中應該工作的片段的implments? – 2015-03-03 01:10:15

+1

差不多。你還必須在'ContentFragment'的'onAttach()'方法中刪除該部分,該方法需要'Activity'來實現接口。 – unrulygnu 2015-03-03 01:14:05

+0

所以我試着創建兩個不同的交互方法名稱,並刪除ContentFramgents(以及onAttach和onDetach中的部分),但它仍然給我這個錯誤 – 2015-03-03 01:16:28

相關問題