2015-10-16 54 views
0

当我尝试为导航抽屉项目实现onClick时,得到了ClassCastException。ClassCastException:主要活动必须实现onFragmentInteractonListener

请找到下面的代码。

我不能找出哪里出了问题

MainActivity:

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener { 

Toolbar toolbar; 
ViewPager pager; 
ViewPagerAdapter adapter; 
SlidingTabLayout tabs; 
CharSequence Titles[] = {"CITY", "GO", "NEAR"}; 
int Numboftabs = 3; 
private FragmentDrawer drawerFragment; 
private Handler mHandler; 

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


    // Creating The Toolbar and setting it as the Toolbar for the activity 

    toolbar = (Toolbar) findViewById(R.id.app_bar); 
    setSupportActionBar(toolbar); 


    // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs. 
    adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs); 

    // Assigning ViewPager View and setting the adapter 
    pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 

    // Assiging the Sliding Tab Layout View 
    tabs = (SlidingTabLayout) findViewById(R.id.tabs); 
    tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width 

    // Setting Custom Color for the Scroll bar indicator of the Tab View 
    tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
     @Override 
     public int getIndicatorColor(int position) { 
      return getResources().getColor(R.color.tabsScrollColor); 
     } 
    }); 

    // Setting the ViewPager For the SlidingTabsLayout 
    tabs.setViewPager(pager); 


    drawerFragment = (FragmentDrawer) 
      getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
    drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar); 
    drawerFragment.setDrawerListener(this); 


    // display the first navigation drawer view on app launch 
    displayView(0); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onDrawerItemSelected(View view, final int position) { 
displayView(position); 

} 
private void displayView(int position) { 
    Fragment fragment = null; 
    String title = getString(R.string.app_name); 
    switch (position) { 
     case 0: 
      fragment = new ContactFragment(); 
      title = getString(R.string.nav_item_contact); 

      break; 
     case 1: 
      fragment = new MyLocation(); 

      title = getString(R.string.nav_item_myloc); 
      break; 

     case 2: 
      fragment = new TermsandCondition(); 
      title = getString(R.string.nav_item_terms); 
      break; 

     case 3: 
      fragment = new UpgradePlan(); 
      title = getString(R.string.nav_item_upgrade); 
      break; 
     case 4: 
      fragment = new Aboutus(); 
      title = getString(R.string.nav_item_about); 


      break; 


     default: 
      break; 
    } 
    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     // fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out); 
     fragmentManager.addOnBackStackChangedListener(null); 
     fragmentTransaction.replace(R.id.container_body, fragment); 
     fragmentTransaction.commit(); 

     // set the toolbar title 
     // actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>")); 
     getSupportActionBar().setTitle(Html.fromHtml("<font color='#000000'>" + title + " </font>")); 
     // final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
     // upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP); 
     // getSupportActionBar().setHomeAsUpIndicator(upArrow); 


    } 
} 
} 

ContactFragment:

public class ContactFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 


// TODO: Rename and change types and number of parameters 
public static ContactFragment newInstance(String param1, String param2) { 
    ContactFragment fragment = new ContactFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

public ContactFragment() { 
    // 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) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_contact, container, false); 
} 

// TODO: Rename method, update argument and hook method into UI event 
public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(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 { 
    // TODO: Update argument type and name 
    public void onFragmentInteraction(Uri uri); 
} 

} 

的logcat:

java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.app.ActivityThread.access$800(ActivityThread.java:155) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5343) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: Caused by: java.lang.ClassCastException: [email protected] must implement OnFragmentInteractionListener 
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime:  at keleno.example.ramz.mapper_city.fragment.ContactFragment.onAttach(ContactFragment.java:85) 

任何帮助表示赞赏!

回答

4

解决方案

添加到您的MainActivity

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener { 

和覆盖public void onFragmentInteraction(Uri uri)的方法MainActivity

,因为你没有实现在Activityinterface托管时出现此错误Fragments。您需要实施Fragmentsinterface

说明

你可以看到这个在您的Fragment你写的条件,看是否托管活动已经实现了基本Fragment InterfaceonAttach()

如果您不打算使用callbacks和其他东西,或者继续并实施接口,理想的建议是从fragment中删除interface

你可以问你是否需要任何进一步的解释。

和是想建议阅读以下内容来获得Fragments东西更广阔的思路, Fragment Basics

+0

嘿,谢谢。由于我是Android新手,很难理解。如果我尝试点击导航项中的不同项目,它会再次崩溃并显示相同的异常。我应该从所有碎片中移除界面吗? – Ramz

+0

是的,删除'接口'将工作,但这不是完美的解决方案,新的,你可以删除并继续你的学习的东西,但后来继续通过链接,并获得更好的主意, –

+0

是的,如果你不使用这些方法的接口,你可以删除它们 –

0

您使用的是片段中的接口传递的值(这可能是在片段的观点你点击)从你的片段到活动。

如果您不需要将片段中的任何此类值传递给您的活动,则可以将其删除,否则可以将片段中的值传递给其接口中的方法,并且可以在活动中覆盖该方法来访问这些参数。因为你不需要将任何东西从你的片段传递给活动,你可以从你的片段中删除接口。你的所有碎片都是一样的情况。