当前位置: 首页 > 知识库问答 >
问题:

在导航抽屉中的活动和片段之间切换

阙奇思
2023-03-14

我不是Android方面的专家,但对片段非常感兴趣。非常感谢您的帮助!

我在我的应用程序中实现了一个导航抽屉。有一个基本抽屉活动和一些片段,用户可以从抽屉菜单中切换。如果我想转移到另一个片段,没有问题,但当我使用意图开始一个新的活动时,它是有效的。如果你看一下我下面的代码,你会发现我使用了两个独立的菜单:一个用于操作栏图标(购物车和搜索),意图在其中完美工作,另一个用于导航抽屉在片段之间跳转。有没有办法把它结合在一起?基本上,我需要移动到配置文件并从nav抽屉中注销活动。提前感谢您的建议!

屏幕在这里

Java文件

public class BaseDrawerActivity extends AppCompatActivity  {

    private DrawerLayout drawerLayout;
    private NavigationView nvDrawer;
    private ActionBarDrawerToggle actionBarDrawerToggle;

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

        drawerLayout = findViewById(R.id.drawer);
        actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close);
        drawerLayout.addDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.syncState();

        nvDrawer = findViewById(R.id.nvgView);
        // Setup drawer view
        setupDrawerContent(nvDrawer);

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

//Menu created for cart and search icons
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
        //return true;
    }

//This method is designed only for cart and search icons
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if(actionBarDrawerToggle.onOptionsItemSelected(item)){
            return true;
        } else if (id == R.id.cart) {
            Intent intent = new Intent(getApplicationContext(), CartActivity.class);
            startActivity(intent);
        } else if (id == R.id.search) {
Intent intent = new Intent(getApplicationContext(), SearchActivity.class);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }

//This method is to set up the drawer content/menu
    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) {
        // Here we create a new fragment and specify the fragment to show based on nav item clicked
        Fragment fragment = null;
        Class fragmentClass;
        switch(menuItem.getItemId()) {
            case R.id.nav_home:
                fragmentClass = HomeFragment.class;
                break;
            case  R.id.nav_cat:
                fragmentClass = CatalogFragment.class;
                break;
            case  R.id.nav_logout:
                fragmentClass = CatalogFragment.class;
                break;

            case R.id.nav_login:
                //what should I add here to be able to move to another activity (not a fragment). It doesn't work when I use intents
            case R.id.nav_profile:
                //need to move to another activity
            default:
                fragmentClass = HomeFragment.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).addToBackStack("back tag").commit();

        // Highlight the selected item has been done by NavigationView
        menuItem.setChecked(true);
        // Set action bar title
        setTitle(menuItem.getTitle());
        // Close the navigation drawer
        drawerLayout.closeDrawers();
    }

}

共有1个答案

柯鸿云
2023-03-14

您是否尝试过与optionItems相同的操作,并在启动活动时阻止执行与片段相关的代码:

public class BaseDrawerActivity extends AppCompatActivity  {

private DrawerLayout drawerLayout;
private NavigationView nvDrawer;
private ActionBarDrawerToggle actionBarDrawerToggle;

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

    drawerLayout = findViewById(R.id.drawer);
    actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close);
    drawerLayout.addDrawerListener(actionBarDrawerToggle);
    actionBarDrawerToggle.syncState();

    nvDrawer = findViewById(R.id.nvgView);
    // Setup drawer view
    setupDrawerContent(nvDrawer);

    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

//Menu created for cart and search icons
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return super.onCreateOptionsMenu(menu);
    //return true;
}

//This method is design only for cart and search icons
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if(actionBarDrawerToggle.onOptionsItemSelected(item)){
        return true;
    } else if (id == R.id.cart) {
        Intent intent = new Intent(getApplicationContext(), CartActivity.class);
        startActivity(intent);
    } else if (id == R.id.search) {
Intent intent = new Intent(getApplicationContext(), SearchActivity.class);
        startActivity(intent);
    }
    return super.onOptionsItemSelected(item);
}

//This method is to set up the drawer content/menu
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) {
    // Here we create a new fragment and specify the fragment to show based on nav item clicked
    Fragment fragment = null;
    Class fragmentClass;
    switch(menuItem.getItemId()) {
        case R.id.nav_home:
            fragmentClass = HomeFragment.class;
            break;
        case  R.id.nav_cat:
            fragmentClass = CatalogFragment.class;
            break;
        case  R.id.nav_logout:
            fragmentClass = CatalogFragment.class;
            break;

        case R.id.nav_login:
             Intent intent = new Intent(getApplicationContext(), OtherActivity.class);
            startActivity(intent);
            break;
        case R.id.nav_profile:
             Intent intent = new Intent(getApplicationContext(), ProfileActivity.class);
             startActivity(intent);
             break;
        default:
            fragmentClass = HomeFragment.class;
    }
    //Code related to fragment should not execute when choosing to start an Activity     
    if(fragmentClass != null){
        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).addToBackStack("back tag").commit();

        // Highlight the selected item has been done by NavigationView
    }
    menuItem.setChecked(true);
    // Set action bar title
    setTitle(menuItem.getTitle());
    // Close the navigation drawer
    drawerLayout.closeDrawers();
    }

}
 类似资料:
  • 我有一个带有导航抽屉的应用程序,它为每个菜单项使用片段。 每次单击一个项目时,我都会替换当前片段。 问题是,在用户单击后显示新片段需要很长时间,并且它会被卡住。加载时间最长的片段是一个片段,其中还包含子片段的选项卡(一个片段包含一个RecyclerView)<有什么方法可以加快碎片的装载速度吗?(如果可能的话,可能会提前初始化它们?) 这是我的代码: HalachaFragment。cs(包含选项

  • 我浏览了一下网站,我找不到我的问题的答案,我试图让我的导航抽屉在活动之间切换,而不是碎片。我尝试了开关语句,所有做的就是崩溃的应用程序,我不知道如何获得抽屉的独立元素,以便设置它们,如果一个被按下,它将转到这个页面,如果另一个被按下它会转到这个页面等。 这是我的密码, } 我一整天都在做这件事,试图修复它,让它工作起来,但运气不好。我花了很长时间才把真正的抽屉打开,但看到它全部消失,我会感到很遗憾

  • 我希望能够使用导航抽屉,并根据导航中的选择在不同片段之间进行更改。 我正在使用Android Studio,基本上我所做的是这样的: 使用内置模板“导航抽屉活动”创建了一个新项目 创建了一个空白片段 然后我更改了onNavigationDrawerItemSelected方法中的一些代码。 我的程序崩溃了,给了我很多我不理解的错误。我做错了什么?

  • 我有一个活动a,一个列表片段P和两个片段Q和R。 当应用程序启动时,会创建一个,加载P。根据用户点击的内容,它被Q或R取代。 现在,通过参考本教程,我实现了一个导航抽屉,向用户显示某些项目。然而,由于我在活动中实现了导航抽屉,它显示了所有片段。我希望它只对P可用。 (非常类似于谷歌Gmail应用程序。当用户在主屏幕上时,抽屉就出现了。当用户点击打开电子邮件时,抽屉就会切换到后退按钮) 我不知道如何

  • 是否可以在android中使用导航抽屉,但我不想更新片段,而是想在活动之间切换,作为我在应用程序中的导航方式。

  • 我在片段和活动之间的导航遇到了麻烦,我使用了Android Studios2.2.3的自动生成模板,并自定义了它来在片段之间导航。 我添加了五个片段,并在导航抽屉活动中使用片段来使用本教程。