Java 从一个片段传递到另一个片段

Java 从一个片段传递到另一个片段,java,android,android-layout,android-fragments,android-studio,Java,Android,Android Layout,Android Fragments,Android Studio,我在这里尝试创建一个菜单,它在单击时从一个片段传递到另一个片段。当我按下菜单中的特定项目(活动)时,活动退出,故障消失 FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();// this line has the problem 这是我的完整日志: 在

我在这里尝试创建一个菜单,它在单击时从一个片段传递到另一个片段。当我按下菜单中的特定项目(活动)时,活动退出,故障消失

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();// this line has the problem
这是我的完整日志:

在 android.support.v4.app.backbackbackrecord.doAddOp(backbackbackrecord.java:414) 在 android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:449) 在 android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:441) atbr.examplozingintegration.MainActivity.selectDrawerItem(MainActivity.java:84 atbr.examplozingintegration.MainActivity$1.onNavigationItemSelected(MainActivity.java:50) 在 android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:150) 在 android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) 在 android.support.v7.view.menu.menuitemmpl.invoke(menuitemmpl.java:152) 在 android.support.v7.view.menu.MenuBuilder.performitemation(MenuBuilder.java:958) 在 android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:308) 在android.view.view.performClick上(view.java:4439) 在android.view.view$PerformClick.run(view.java:18395) 位于android.os.Handler.handleCallback(Handler.java:725) 位于android.os.Handler.dispatchMessage(Handler.java:92) 位于android.os.Looper.loop(Looper.java:176) 位于android.app.ActivityThread.main(ActivityThread.java:5319) 位于java.lang.reflect.Method.Invokenactive(本机方法) 位于java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 在dalvik.system.NativeStart.main(本机方法)

MainActivity.java

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        txResult = (TextView) findViewById(R.id.txResult);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        nvDrawer = (NavigationView) findViewById (R.id.nvView);
        setupDrawerContent(nvDrawer);}



    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });
    }

    public void selectDrawerItem(MenuItem menuItem) {
        // Create a new fragment and specify the planet to show based on
        // position
        Fragment fragment = null;

        Class fragmentClass;
        switch(menuItem.getItemId()) {
            case R.id.nav_first_fragment:
                fragmentClass = MainActivity.class;
                break;
            case R.id.nav_second_fragment:
                fragmentClass = SecondActivity.class;
                break;
            case R.id.nav_third_fragment:
                fragmentClass = ThirdActivity.class;
                break;
            default:
                fragmentClass = MainActivity.class;
        }

        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

        // Highlight the selected item, update the title, and close the drawer
        menuItem.setChecked(true);
        setTitle(menuItem.getTitle());
        mDrawer.closeDrawers();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawer.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

   // @Override
   // protected void onPostCreate(Bundle savedInstanceState) {
   //     super.onPostCreate(savedInstanceState);
   // 
 private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });
    }

    public void selectDrawerItem(MenuItem menuItem) {
        // Create a new fragment and specify the planet to show based on
        // position
        Fragment fragment = null;

        Class fragmentClass;
        switch(menuItem.getItemId()) {
            case R.id.nav_first_fragment:
                fragmentClass = MainActivity.class;
                break;
            case R.id.nav_second_fragment:
                fragmentClass = SecondActivity.class;
                break;
            case R.id.nav_third_fragment:
                fragmentClass = ThirdActivity.class;
                break;
            default:
                fragmentClass = SecondActivity.class;
        }

        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

        // Highlight the selected item, update the title, and close the drawer
        menuItem.setChecked(true);
        setTitle(menuItem.getTitle());
        mDrawer.closeDrawers();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawer.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

    // @Override
    // protected void onPostCreate(Bundle savedInstanceState) {
    //     super.onPostCreate(savedInstanceState);
    // }
SecondActivity.java

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        txResult = (TextView) findViewById(R.id.txResult);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        nvDrawer = (NavigationView) findViewById (R.id.nvView);
        setupDrawerContent(nvDrawer);}



    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });
    }

    public void selectDrawerItem(MenuItem menuItem) {
        // Create a new fragment and specify the planet to show based on
        // position
        Fragment fragment = null;

        Class fragmentClass;
        switch(menuItem.getItemId()) {
            case R.id.nav_first_fragment:
                fragmentClass = MainActivity.class;
                break;
            case R.id.nav_second_fragment:
                fragmentClass = SecondActivity.class;
                break;
            case R.id.nav_third_fragment:
                fragmentClass = ThirdActivity.class;
                break;
            default:
                fragmentClass = MainActivity.class;
        }

        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

        // Highlight the selected item, update the title, and close the drawer
        menuItem.setChecked(true);
        setTitle(menuItem.getTitle());
        mDrawer.closeDrawers();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawer.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

   // @Override
   // protected void onPostCreate(Bundle savedInstanceState) {
   //     super.onPostCreate(savedInstanceState);
   // 
 private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        selectDrawerItem(menuItem);
                        return true;
                    }
                });
    }

    public void selectDrawerItem(MenuItem menuItem) {
        // Create a new fragment and specify the planet to show based on
        // position
        Fragment fragment = null;

        Class fragmentClass;
        switch(menuItem.getItemId()) {
            case R.id.nav_first_fragment:
                fragmentClass = MainActivity.class;
                break;
            case R.id.nav_second_fragment:
                fragmentClass = SecondActivity.class;
                break;
            case R.id.nav_third_fragment:
                fragmentClass = ThirdActivity.class;
                break;
            default:
                fragmentClass = SecondActivity.class;
        }

        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

        // Highlight the selected item, update the title, and close the drawer
        menuItem.setChecked(true);
        setTitle(menuItem.getTitle());
        mDrawer.closeDrawers();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        switch (item.getItemId()) {
            case android.R.id.home:
                mDrawer.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

    // @Override
    // protected void onPostCreate(Bundle savedInstanceState) {
    //     super.onPostCreate(savedInstanceState);
    // }

您的问题不清楚,因为您没有发布完整的类代码,以及您遇到的错误

据我所知,当选择导航抽屉中的项目时,您希望更改片段。类似于Gmail应用程序,当用户从收件箱文件夹移动到已发送文件夹或任何其他文件夹时

如果您正尝试执行相同的操作,则需要执行一个活动,即插入片段。选择导航抽屉中的项目后,应根据导航抽屉中选择的选项将当前片段替换为新片段

检查以下两个链接,这将给你整个想法

链接1:

链接2:

调用
remove(Fragment)
,然后调用
add(int,Fragment,String)
以实际替换片段。因此,在您的情况下,可能会出现容器视图中没有片段,因此您正在调用
remove(null)
。因此,请检查是否必须添加或替换片段

您可以检查容器视图中是否有任何片段,并相应地继续:

 FragmentManager fragmentManager = getSupportFragmentManager();
 android.support.v4.app.Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.flContent);
 if(currentFragment==null){ 
    fragmentManager.beginTransaction().add(R.id.flContent, fragment).commit();
 }else{
   fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
 }

希望这能解决您的问题。

您在logcat中有任何错误吗?请发布。这是logcat错误:致命异常:main java.lang.nullpointerException请在您的问题中发布完整的日志cat。添加了完整的logcat@rohit5k2哪一行是第84行?错误在MainActivity.java:84什么是flContainer?它在代码中:我想你的
FrameLayout
的id是你添加片段的地方。它是第一行的一个打字错误。已编辑。它无法解决fragmentManager#。很抱歉,如果我发布愚蠢的问题,这是我第一次编程Android。这不是一个愚蠢的问题打开。选中“编辑”。