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

在导航抽屉项上切换片段单击

汪耀
2023-03-14

我在我的应用程序中使用抽屉菜单,并实现了在NavigationDrawer片段类中切换片段的逻辑。我最近读到片段切换只能从托管活动中发生。

有一个从NavigationDrawerFragment调用的接口,用于通知导航抽屉列表视图中所选位置的MainActivity。

public static interface NavigationDrawerCallbacks {
    /**
     * Called when an item in the navigation drawer is selected.
     */
    void onNavigationDrawerItemSelected(int position);
} 

我感到困惑的是,在Mainactive中有一个静态片段,它是使用NavigationDrawer片段中接口提供的位置调用的。

@Override
public void onNavigationDrawerItemSelected(int position) {

    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager
            .beginTransaction()
            .replace(R.id.container,
                    PlaceholderFragment.newInstance(position)).commit();

}

PlaceHolderFragment类如下所示:

public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static Fragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();

        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MCMainActivity) activity).onSectionAttached(getArguments()
                .getInt(ARG_SECTION_NUMBER));
    }
}

目前我的碎片交易是这样发生的:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mDrawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView
            .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    selectItem(position);
                    Fragment fragment;
                    FragmentManager fManager = getFragmentManager();

                    int count = fManager.getBackStackEntryCount();
                    for (int i = 0; i < count; ++i) {

                        fManager.popBackStackImmediate();
                        Log.e("NavFrag", "Popped frag" + i);
                    }
                    FragmentTransaction fTransaction = fManager
                            .beginTransaction();
                    switch (position) {
                    case 0:
                        fragment = new MCTrackFragment();
                        fTransaction.replace(R.id.container, fragment)

                                .commit();
                        break;
                    case 1:
                        fragment = new MCPlaylistFragment();
                        fTransaction.replace(R.id.container, fragment)
                                .commit();
                        break;
                    case 2:
                        fragment = new MCOfflineSongs();
                        fTransaction.replace(R.id.container, fragment)
                                .commit();
                        break;
                    case 3:
                        fragment = new MCOwnFeed();
                        fTransaction.replace(R.id.container, fragment)
                                .commit();
                        break;
                    case 4:
                        fragment = new MCCategories();
                        fTransaction.replace(R.id.container, fragment)
                                .commit();
                        break;
                    }
                }
            });
    mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
            .getThemedContext(),
            android.R.layout.simple_list_item_activated_1,
            android.R.id.text1, new String[] {
                    getString(R.string.title_section1),
                    getString(R.string.title_section2),
                    getString(R.string.title_section3),
                    getString(R.string.title_section4),
                    getString(R.string.title_section5) }));
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
    return mDrawerListView;
}

当我们使用Navigationdrawer创建项目时,会自动生成占位符片段。

占位符片段用于什么?

我应该怎么做才能使片段事务在承载这些片段的活动内发生?

我尝试在接口实现中添加片段事务,但它不起作用。

感谢帮助,提前感谢

共有1个答案

朱自明
2023-03-14

我们需要始终从活动中切换片段是正确的,因此我们需要从抽屉菜单片段向将要托管要显示的新片段的活动提供回调。在活动中,切换片段的代码如下:

@Override
public void onNavigationDrawerItemSelected(int position) {

    Fragment fragment;
    FragmentManager fManager = getFragmentManager();
    Bundle args = new Bundle();
    args.putInt(MCConstants.ARG_SECTION_NUMBER, position);
    clearAllBackStack();
    FragmentTransaction fTransaction = fManager.beginTransaction();
    if (MCMediaPlayerService.getInstance() != null) {
        MCMediaPlayerService.getInstance().stopMusic();

    }
    MCSelectedTrackIdSingleton.getInstance().mCurrentSongId = 0;
    MCSelectedSongIdSingleton.getInstance().mCurrentSongId = 0;

    switch (position) {
    case 0:
        fragment = new MCTrackFragment();
        fragment.setArguments(args);
        fTransaction.replace(R.id.container, fragment,
                MCConstants.TRACK_TAG).commit();
        break;
    case 1:
        fragment = new MCPlaylistFragment();
        fragment.setArguments(args);
        fTransaction.replace(R.id.container, fragment,
                MCConstants.PLAYLIST_TAG).commit();
        break;
    case 2:
        fragment = new MCOfflineSongs();
        fragment.setArguments(args);
        fTransaction.replace(R.id.container, fragment,
                MCConstants.OFFLINE_TAG).commit();
        break;
    case 3:
        fragment = new MCOwnFeed();
        fragment.setArguments(args);
        fTransaction.replace(R.id.container, fragment,
                MCConstants.OWNFEED_TAG).commit();
        break;
    case 4:
        fragment = new MCCategories();
        fragment.setArguments(args);
        fTransaction.replace(R.id.container, fragment,
                MCConstants.CATEGORIES_TAG).commit();
        break;
    }

}

抽屉菜单片段类的onCreate方法里面:

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Read in the flag indicating whether or not the user has demonstrated
    // awareness of the
    // drawer. See PREF_USER_LEARNED_DRAWER for details.
    SharedPreferences sp = PreferenceManager
            .getDefaultSharedPreferences(getActivity());
    mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);

    if (savedInstanceState != null) {
        mCurrentSelectedPosition = savedInstanceState
                .getInt(STATE_SELECTED_POSITION);
        mFromSavedInstanceState = true;
    }

    // Select either the default item (0) or the last selected item.
    selectItem(mCurrentSelectedPosition); //Select item called
}

选择项目方法如下:

 private void selectItem(int position) {
    mCurrentSelectedPosition = position;
    if (mDrawerListView != null) {
        mDrawerListView.setItemChecked(position, true);
    }
    if (mDrawerLayout != null) {
        mDrawerLayout.closeDrawer(mFragmentContainerView);
    }
    if (mCallbacks != null) {
        mCallbacks.onNavigationDrawerItemSelected(position);
    }
}
 类似资料:
  • 我希望能够使用导航抽屉,并根据导航中的选择在不同片段之间进行更改。 我正在使用Android Studio,基本上我所做的是这样的: 使用内置模板“导航抽屉活动”创建了一个新项目 创建了一个空白片段 然后我更改了onNavigationDrawerItemSelected方法中的一些代码。 我的程序崩溃了,给了我很多我不理解的错误。我做错了什么?

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

  • 我不是Android方面的专家,但对片段非常感兴趣。非常感谢您的帮助! 我在我的应用程序中实现了一个导航抽屉。有一个基本抽屉活动和一些片段,用户可以从抽屉菜单中切换。如果我想转移到另一个片段,没有问题,但当我使用意图开始一个新的活动时,它是有效的。如果你看一下我下面的代码,你会发现我使用了两个独立的菜单:一个用于操作栏图标(购物车和搜索),意图在其中完美工作,另一个用于导航抽屉在片段之间跳转。有没

  • 我有导航抽屉的BaseActivity,我在其中使用片段管理器在片段布局中显示/隐藏片段,当单击每个导航抽屉项时,我希望每次单击导航项时都刷新我的片段。我尝试了两种方法,例如片段附加/分离,但它不起作用,有谁能帮我在每次点击导航项时刷新我的片段吗。

  • 编辑:我的滑动标签碎片ATabs似乎有问题。没有使用ATabs片段,只需使用导航抽屉在片段A1和B之间切换,一切都很好!可以添加列表项。编辑的主要活动: 但当我使用ATabs片段(见下面的MainActivity)并切换到它并返回时,就不可能再添加ListItems了。尽管Logcat显示日志。v(LOG_标签,“添加项”) 每次按add()。 我不知道是什么导致了这个问题。如果ATabs需要是一

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