Android ClassCastException:主活动必须在FragmentInteractionListener上实现

Android ClassCastException:主活动必须在FragmentInteractionListener上实现,android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,当我尝试为导航抽屉项实现onClick时,我得到了ClassCastException 请在下面查找代码 我不知道哪里出了问题 主要活动: public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener { Toolbar toolbar; ViewPager pager; ViewPagerAdapter adapter; SlidingTabLayout

当我尝试为导航抽屉项实现onClick时,我得到了ClassCastException

请在下面查找代码

我不知道哪里出了问题

主要活动:

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);


    }
}
}
日志:

 java.lang.ClassCastException:    keleno.example.ramz.mapper_city.MainActivity@21c6ea2b 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: keleno.example.ramz.mapper_city.MainActivity@21c6ea2b 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)

感谢您的帮助

解决方案

将此添加到您的
main活动中

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
并重写
MainActivity
public void onFragmentInteraction(Uri)中的方法

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
发生此错误的原因是您没有在托管
片段的
活动中实现
接口。您需要实现所有
片段的
接口

解释

您可以在
片段的
onAttach()
中看到这一点,您可以在其中编写一个条件,以查看托管活动是否实现了底层的
片段接口

理想的建议是,如果您不打算使用
回调
和其他东西,或者继续并实现接口,则从
片段
中删除
接口

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

是的,我建议您阅读以下内容,以更广泛地了解
片段
内容,
解决方案

将此添加到您的
main活动中

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
并重写
MainActivity
public void onFragmentInteraction(Uri)
中的方法

public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
发生此错误的原因是您没有在托管
片段的
活动中实现
接口。您需要实现所有
片段的
接口

解释

您可以在
片段的
onAttach()
中看到这一点,您可以在其中编写一个条件,以查看托管活动是否实现了底层的
片段接口

理想的建议是,如果您不打算使用
回调
和其他东西,或者继续并实现接口,则从
片段
中删除
接口

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

是的,我建议您阅读以下内容,以更广泛地了解
片段
内容,

您正在使用片段中的接口将值(可能是您单击的片段中的视图)从片段传递到活动


如果不需要将任何此类值从片段传递到活动,则可以将其删除,否则可以将值从片段传递到其接口中的方法,并且可以在活动中重写该方法以访问该参数。由于不需要将任何值从片段传递到活动,您可以从片段中删除接口。你所有的碎片都是这样

您正在使用片段中的接口将值(可能是您单击的片段中的视图)从片段传递到活动


如果不需要将任何此类值从片段传递到活动,则可以将其删除,否则可以将值从片段传递到其接口中的方法,并且可以在活动中重写该方法以访问该参数。由于不需要将任何值从片段传递到活动,您可以从片段中删除接口。你所有的碎片都是这样

嘿,谢谢。因为我是android新手,所以不难理解。如果我尝试单击导航项中的其他项,它将再次崩溃并显示相同的异常。我应该从所有片段中删除界面吗?是的,删除
界面
会起作用,但这不是完美的解决方案,对于新手,你可以删除并继续学习,但稍后通过链接获取更好的想法,是的,如果你没有使用这些方法界面,你可以删除它们,我可以在这里解释一切,但这是多余的,因为有很多线程都有相同的东西:)嘿,谢谢。因为我是android新手,所以不难理解。如果我尝试单击导航项中的其他项,它将再次崩溃并显示相同的异常。我应该从所有片段中删除界面吗?是的,删除
界面
会起作用,但这不是完美的解决方案,对于新手,你可以删除并继续学习,但稍后通过链接获取更好的想法,是的,如果你没有使用这些方法界面,您可以删除它们,我可以在这里解释所有内容,但这将是多余的,因为有许多线程具有相同的内容:)