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

Posted

技术标签:

【中文标题】从一个片段传递到另一个片段【英文标题】:Passing from one fragment to another 【发布时间】:2016-06-12 06:07:32 【问题描述】:

我在这里尝试创建一个菜单,在点击时。当我按下菜单中的特定项目(活动)时,活动退出,故障是

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();// this line has the problem

这是我完整的 logcat:

FATAL EXCEPTION: main                                                                               java.lang.NullPointerException                                        

android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:414) 在 android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:449) 在 android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:441) atbr.exemplozxingintegration.MainActivity.selectDrawerItem(MainActivity.java:84 atbr.exemplozxingintegration.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.MenuItemImpl.invoke(MenuItemImpl.java:152) 在 android.support.v7.view.menu.MenuBuilder.performItemAction(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.invokeNative(Native Method) 在 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(Native Method)

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

SecondActivity.java

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

【问题讨论】:

您在 logcat 中是否有任何错误?请张贴。 这是 logcat 错误:FATAL EXCEPTION: main java.lang.NullPointerException 请在您的问题中发布完整的日志猫。 添加了完整的 logcat @Rohit5k2 第 84 行是哪一行?错误在 MainActivity.java:84 【参考方案1】:

您的问题不清楚,因为您没有发布完整的课程代码,以及您遇到了什么错误。

我所理解的是,在选择导航抽屉项时要更改片段。类似于 Gmail 应用,当用户从收件箱文件夹移动到已发送文件夹或任何其他文件夹时。

如果你想这样做,你需要做一个活动,插入一个片段。选择导航抽屉中的项目时,应根据导航抽屉中选择的选项将当前片段替换为新片段。

检查以下两个链接,这将为您提供完整的想法。

链接1:https://androidbelieve.com/material-navigation-drawer-with-header/

链接2:http://joerichard.net/android/android-how-to-change-fragments-when-navigation-drawer-item-selected/

【讨论】:

【参考方案2】:

FragmentTransaction.replace 调用remove(Fragment) 然后add(int, Fragment, String) 实际替换片段。因此,在您的情况下,容器视图中可能存在 no 片段,因此您正在调用 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();
 

希望这能解决您的问题。

【讨论】:

什么是 flContainer? 它在您的代码中:我认为您的 FrameLayout 的 ID 是您将片段添加到的位置。 这是第一行的错字。已编辑。 无法解析 fragmentManager#。对不起,如果我发布愚蠢的问题,这是我第一次编程 android 没关系。这不是一个愚蠢的问题。检查编辑。

以上是关于从一个片段传递到另一个片段的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从一个片段的回收器视图项传递到另一个片段

完全下载文件时,将下载的文件从一个片段传递到另一个片段

如何将值从一个活动中的片段传递到另一个活动? [复制]

将数据从 Fragment 传递到另一个 Fragment

如何使用java将数据从片段传递到android中的另一个片段?

如何将数据从一个活动传递到android中的另一个活动片段? [复制]