我有一个带有不同碎片的导航抽屉。每个Fragment
都应使用默认工具栏,但需要折叠Fragment
的{{1}}除外。
如何在片段的工具栏之间切换?
答案 0 :(得分:5)
似乎你想要实现这样的目标。
我使用常用工具栏进行了一项活动。切换到折叠工具栏片段时,我使工具栏透明,片段的工具栏接管。切换到其他片段时,工具栏的颜色保持不变。
这允许您在xml中管理完整的折叠工具栏的布局结构,逻辑保留在Fragment中。
希望这会有所帮助。请参阅gif链接。
答案 1 :(得分:3)
您可以轻松地从Toolbar
获取Fragment
,然后在Toolbar
内修改或更改Fragment
的某些属性。
要从Toolbar
获取Activity
,您可以考虑使用此功能。
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
现在,您需要对Toolbar
函数中的onResume
进行更改,然后在每次从Fragment
内部onStop
函数返回时撤消更改。否则,当从导航抽屉切换到其他Fragment
时,Fragment
中所做的更改也会被转移到其他片段。
但在您的情况下,我建议每个Fragment
应该拥有Toolbar
,以便它们不会相互冲突,并且可以根据需要进行修改。是的,请从Toolbar
中移除Activity
。
所以在Toolbar
的布局中添加Fragment
就像这样。
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"/>
然后在Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
// Modify your Toolbar here.
// ...
// For example.
// toolbar.setBackground(R.color.red);
// Create home button
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
并覆盖onOptionsItemSelected
功能。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
getActivity().onBackPressed();
}
return super.onOptionsItemSelected(item);
}
答案 2 :(得分:1)
我发现的最佳解决方案是轻松折叠,锁定它(将其保持在折叠模式)并解锁折叠工具栏。
private void collapseAppBar() {
// Collapse the AppBarLayout with animation
mAppBarLayout.setExpanded(false, true);
}
private void lockAppBar() {
/* Disable the nestedScrolling to disable expanding the
appBar with dragging the nestedScrollView below it */
ViewCompat.setNestedScrollingEnabled(nestedScrollView, false);
/* But still appBar is expandable with dragging the appBar itself
and below code disables that too
*/
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(AppBarLayout appBarLayout) {
return false;
}
});
}
private void unLockAppBar() {
ViewCompat.setNestedScrollingEnabled(nestedScrollView, true);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(AppBarLayout appBarLayout) {
return true;
}
});
}
}
我以这种方式使用这些功能:
Fragment fragment = null;
Class fragmentClass;
switch (menuItem.getItemId()) {
case R.id.fragment1:
unLockAppBar();
fragmentClass = first_Fragment.class;
break;
case R.id.fragment2:
collapseAppBar();
lockAppBar();
fragmentClass = second_Fragment.class;
break;
case R.id.fragment3:
collapseAppBar();
lockAppBar();
fragmentClass = third_Fragment.class;
break;
答案 3 :(得分:0)
我正在将Jetpack's Navigation components与单个Activity和我的应用程序中的不同片段一起使用。
某些片段可从底部导航访问(并从Activity中获得Toolbar
)。其他一些是“特殊”片段,并且具有自己的可折叠工具栏。
要实现此目的,我在“特殊”片段中通过“活动”中的此代码隐藏了“活动”中的工具栏:
// Handle toolbar changes in different Fragments
val navController = findNavController(R.id.nav_host_fragment)
navController.addOnDestinationChangedListener { _, destination, _ ->
when (destination.id) {
R.id.my_special_fragment_with_collapsible_toolbar -> {
binding.toolbarMain.visibility = View.GONE
}
else -> {
binding.toolbarMain.visibility = View.VISIBLE
}
}
}
答案 4 :(得分:0)
建议的做法是在片段中使用工具栏,而不是在活动中使用常见的工具栏。这样,您可以控制片段中工具栏的外观和行为。请参阅https://developer.android.com/guide/navigation/navigation-ui#support_app_bar_variations