gpt4 book ai didi

android - 在 `AppCompatActivity` 和 `Fragments` 中向上导航

转载 作者:行者123 更新时间:2023-11-30 01:55:14 25 4
gpt4 key购买 nike

我试图在我的应用程序中设置正确的导航,它替换了主要内容区域中的 Fragment,因此我只有一个 Activity。我有一个主要的 Fragment 和几个子 Fragment,例如用于偏好设置的 Fragment。使用后退按钮时一切正常,但除此之外我还想实现包括图标在内的向上导航。我正在使用通过 Activity.getSupportActionBar() 获取的 ActionBar 以及来自 appcompat 的 ToolbarActionBarDrawerToggle

我关注了this tutorial首先设置我的 Drawer 时。

当前行为:当我启动应用程序时,列表/抽屉图标显示在 ActionBar 的左侧。单击此按钮时,抽屉 打开,我可以选择项目。子 Fragment 被替换到我的内容中,后退按钮弹出堆栈,带我回到上一个 Fragment

缺失行为:左上角的列表/抽屉图标永远不会被后退箭头图标取代,我不知道如何正确地实现它。单击列表/抽屉图标时,抽屉 总是被拉出,无论我在哪个 fragment 中。

我尝试了什么:

  1. 我尝试关注 this回答。它有点工作,这意味着后退箭头图标设置在子 Fragment 中,但单击后退箭头仍会打开 Drawer 而不是提供向上导航。此外,当使用后退按钮“向上”时,列表/抽屉图标将被替换为空。
  2. 我也试过关注 this回答。在这里,所需的 ActionBar 行为/外观在各种 FragmentonCreate() 方法中实现。使用这个我可以让后退箭头向上,但是当点击箭头时 Drawer 仍然被拉动。
  3. 其他各种小事和技巧。

我的问题:

  1. 我下面的代码有什么问题?
  2. 使用 ActionBarToolbarActionBarDrawerToggle 组合来实现 Drawer 导航是否正确/正常与向上导航一起?

MyActivity.onCreate():

@Override
protected void onCreate(Bundle savedInstanceState)
{
// Other stuff

// Setup drawer.
mDrawerFragment = (DrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.mm_navigation_drawer);
mDrawerFragment.initialize(this, (DrawerLayout)findViewById(R.id.mm_drawer_layout), toolbar);
}

DrawerFragment 类

public class DrawerFragment extends Fragment
{
private MyActivity mMyActivity;
private MyActionBarDrawerToggle mMyBarDrawerToggle;
private DrawerLayout mDrawerLayout;
private FragmentDrawerListener mFragmentDrawerListener;
private View mContainerView;

public void initialize(MyActivity myActivity, final DrawerLayout drawerLayout, final Toolbar toolbar)
{
mMyActivity = myActivity;
mFragmentDrawerListener = mMyActivity;
mContainerView = myActivity.findViewById(R.id.mm_navigation_drawer);

mMyActionBarDrawerToggle = new MyActionBarDrawerToggle(myActivity, drawerLayout, toolbar, R.string.mm_drawer_open, R.string.mm_drawer_close);

mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerListener(mMyActionBarDrawerToggle);
mDrawerLayout.post(new Runnable()
{
@Override
public void run()
{
mMyActionBarDrawerToggle.syncState();
}
});
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState)
{
// Not relevant, just create and return the View.
}
}

MyActivity.onDrawerItemSelected()

接口(interface)FragmentDrawerListener 的实现是在MyActivity 类中完成的。它只是使用 FragmentTransaction 将内容区域替换为其他 Fragment

@Override
public void onDrawerItemSelected(View view, int postion)
{
switch (postion)
{
case DrawerAdapter.ITEM_FILTERED_RECIPES:
showFilteredRecipesFragment();
break;

case DrawerAdapter.ITEM_SELECTED_RECIPES:
showSelectedRecipesFragment();
break;

case DrawerAdapter.ITEM_SHOPPING_LIST:
showShoppingListFragment();
break;

case DrawerAdapter.ITEM_SETTINGS:
showSettingsFragment();
break;

case DrawerAdapter.ITEM_ABOUT:
showAboutFragment();
break;
}
}

MyActionBarDrawerToggle 类

public class MyActionBarDrawerToggle extends ActionBarDrawerToggle
{
private MyActivity mMyActivity;
private Toolbar mToolbar;

public MyActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes)
{
super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);
mMyActivity = (MyActivity) activity;
mToolbar = toolbar;
}

@Override
public void onDrawerOpened(View drawerView)
{
super.onDrawerOpened(drawerView);
mMyActivity.invalidateOptionsMenu();
}

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

@Override
public void onDrawerSlide(View drawerView, float slideOffset)
{
super.onDrawerSlide(drawerView, slideOffset);
mToolbar.setAlpha(1 - slideOffset / 2);
}
}

DrawerFragment 使用简单的静态 Fragment 实例在主布局中膨胀,如下所示:

<fragment
android:id="@+id/my_navigation_drawer"
android:name="com.my.company.gui.drawer.DrawerFragment"
android:layout_width="@dimen/my_nav_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
app:layout="@layout/my_drawer_navigation_fragment"
tools:layout="@layout/my_drawer_navigation_fragment">
</fragment>

最佳答案

如果您的应用使用 Material Design,那么您应该使用 Toolbar 来替换 Activity 中的 Actionbar。您仍将维护您的 ActionBarDrawerToggle 并且功能将保持不变。

至于你的 fragment ,只要它们被同一个 Activity (即抽屉 Activity )“安置”,改变 fragment 不会导致抽屉切换改变后退箭头。它只会在您导航到新 Activity 时发生变化。只有这样,主要 Activity 才会被视为主页,而其他 Activity 将有一个后退箭头以返回

关于android - 在 `AppCompatActivity` 和 `Fragments` 中向上导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com