【问题标题】:How to open any fragment after Navigation Drawer closed导航抽屉关闭后如何打开任何片段
【发布时间】:2017-08-18 23:36:02
【问题描述】:

我的片段在单击导航抽屉项目后立即打开。我希望它在导航抽屉关闭后打开。

导航抽屉支持库中抽屉关闭后如何打开片段?

private void initNavigationView()
{
    navigationView = (NavigationView) findViewById(R.id.navigation_view);
    drawerLayout = (DrawerLayout) findViewById(R.id.navigation_drawer);

    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.nav_open, R.string.nav_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {super.onDrawerClosed(drawerView)
        }

    };
    drawerLayout.post(new Runnable() {
            @Override
            public void run() {
                drawerToggle.syncState();
            }
        });
    drawerToggle.setDrawerIndicatorEnabled(true);
    drawerLayout.setDrawerListener(drawerToggle);
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {

                switch (menuItem.getItemId()) {
                    case R.id.tentang:
                        break;
                    case R.id.keluar:
                        finish();
                        break;
                }
                selectDrawerItem(menuItem);
                return true;
            }

            private void selectDrawerItem(MenuItem menuItem)
            {
                Fragment fragment = null;
                Class fragmentClass = null;

                switch (menuItem.getItemId())
                {
                    case R.id.fragment_home:
                        fragmentClass = com.wahyuapps.benux.fragment.fragmentHome.class;
                        break;
                    case R.id.fragment_distro_linux:
                        fragmentClass = com.wahyuapps.benux.fragment.fragmentDistroLinux.class;
                        break;
                }
                try {
                    fragment = (Fragment)fragmentClass.newInstance();
                }catch(Exception e){
                    e.printStackTrace();
                }
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit();
                menuItem.setChecked(true);
                setTitle(menuItem.getTitle());
                drawerLayout.closeDrawers();
            }
        });
}

我在上面放什么代码? 抽屉关闭时如何打开片段? 在我的情况下,我的片段在单击该项目后打开。我想在抽屉关闭后打开一些延迟的片段。

【问题讨论】:

  • “通话片段”是什么意思?怎么打开?

标签: java android


【解决方案1】:
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        TestingFragment hello = new TestingFragment();
        fragmentTransaction.add(R.id.mainlayout, hello, "HELLO");
        fragmentTransaction.commit();

您可以使用它调用片段...并且 R.id.mainlayout 是您的活动的根布局。

编辑 2

延迟后打开片段

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    FragmentManager fragmentManager = getSupportFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit();
                    menuItem.setChecked(true);
                    setTitle(menuItem.getTitle());

                }
            }, 1000);

为处理程序选择此导入 - import android.os.Handler;

【讨论】:

  • 我创建私有 Handler 处理程序;并得到了修复处理程序,但在片段上出现错误“这个变量必须是最终变量”,当我将其设为最终变量时,其他片段出现错误“这个变量是最终的,无法修改”
  • 现在延迟打开片段工作正常。但在结束延迟后,我在片段上得到了 fc。我认为变量“private Fragment fragment;”和“Fragment mFragment = null;”的问题
  • 现在我的应用程序在将变量更改为 onCreate 后没有错误。但这种延迟没有显示效果。你能给我第一个代码吗??我认为你的第一个代码将适用于我的代码。
  • 修复了两个代码兄弟。你的代码没有错。只有我的变量错了。我的变量必须在方法 onCreate 上设置
【解决方案2】:

我认为您想延迟打开 片段。如果您需要在抽屉关闭后进行片段过渡。然后,您可以通过延迟过渡来实现这一目标。

你的代码应该是这样的。

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.tentang:
                    break;
                case R.id.keluar:
                    finish();
                    break;
            }
            selectDrawerItem(menuItem);
            return true;
        }

        private void selectDrawerItem(MenuItem menuItem)
        {
            Fragment fragment = null;
            Class fragmentClass = null;

            switch (menuItem.getItemId())
            {
                case R.id.fragment_home:
                    fragmentClass = com.wahyuapps.benux.fragment.fragmentHome.class;
                    break;
                case R.id.fragment_distro_linux:
                    fragmentClass = com.wahyuapps.benux.fragment.fragmentDistroLinux.class;
                    break;
            }
            try {
                fragment = (Fragment)fragmentClass.newInstance();
            }catch(Exception e){
                e.printStackTrace();
            }
                changeFragment(fragment);
                menuItem.setChecked(true);
                setTitle(menuItem.getTitle());
                drawerLayout.closeDrawers();
            }
        });

创建一个方法来改变片段

 public void changeFragment(final Fragment fragment){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.fragment_content, fragment).commit();
            }
        }, 400);
    }

我刚刚输入了 400 毫秒的转换延迟。随心所欲地改变它。

希望对你有帮助:)

【讨论】:

  • 现在真的修复了。该代码没有错。只有我忘记删除下面的 Fragment 方法。顺便说一句,我在导航抽屉中使用 350 毫秒以获得最佳性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多