- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在迁移到 android 导航组件,当在 BottomNavigationView 中选择一个新项目时,无法使 fragment 转换正常工作。我按照官方文档中的说明进行操作,但没有发现所选 fragment 未显示的任何问题。
在 onCreate 方法的 Activity 中设置导航 Controller :
NavController navController = Navigation.findNavController(this, R.id.fragment_main_layout_nav_host);
NavigationUI.setupActionBarWithNavController(this, navController);
NavigationUI.setupWithNavController(binding.includedAppbarMain.bottomNavigationViewMainAppbar, navController);
布局包含导航主机 fragment 和 BottomNavigationView:
<fragment
android:id="@+id/fragment_main_layout_nav_host"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/activity_main"
app:defaultNavHost="true"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation_view_main_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/activity_main_bottom_navigation" />
BottomNavigationView 的菜单:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_activity_main_home"
android:title="Home"
android:enabled="true"
android:icon="@drawable/ic_home_24dp"/>
<item
android:id="@+id/action_activity_main_notebooks"
android:title="Notebooks"
android:enabled="true"
android:icon="@drawable/ic_file_24dp"/>
<item
android:id="@+id/action_activity_main_search"
android:title="Search"
android:enabled="true"
android:icon="@drawable/ic_search_24dp"/>
</menu>
导航:
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
app:startDestination="@id/action_activity_main_home">
<fragment
android:id="@+id/action_activity_main_home"
android:name="com.inknotes.view.fragment.MainHomeFragment"
android:label="@string/main_vertical_navigation_home"
tools:layout="@layout/fragment_main_home" />
<fragment
android:id="@+id/action_activity_main_notebooks"
android:name="com.inknotes.view.fragment.MainNotebookFragment"
android:label="@string/main_vertical_navigation_notebooks"
tools:layout="@layout/fragment_main_notebook" />
<fragment
android:id="@+id/action_activity_main_search"
android:name="com.inknotes.view.fragment.MainSearchFragment"
android:label="@string/main_vertical_navigation_search"
tools:layout="@layout/fragment_main_search" />
</navigation>
菜单项和 fragment 的 ID 也匹配,我想不出为什么当我在 BottomNavigationView 中选择另一个项目时没有显示新 fragment 。
我做了一些更多的测试,发现从后台弹出 fragment 也不起作用,也许我的导航 Controller 有一些一般性问题?
MainActivity(我删除了一些东西,因为它太长了):
@MainActivityScope
public class MainActivity extends AppCompatActivity implements ComponentCallbacks2, MainActivityHandler,
SpeedDialView.OnActionSelectedListener, BottomNavigationView.OnNavigationItemSelectedListener {
// Static variables
public static final String EXTRA_PATH = "com.inknotes.EXTRA_PATH";
// Injected objects
@Inject MainHomeFragment mainHomeFragment;
@Inject MainFolderFragment mainFolderFragment;
@Inject MainNotebookFragment mainNotebookFragment;
@Inject MainSearchFragment mainSearchFragment;
@Inject MainFolderAddDialog mainFolderAddDialog;
@Inject MainNotebookAddDialog mainNotebookAddDialog;
@Inject MainNotebookActionModeCallback mainNotebookActionModeCallback;
@Inject MainFolderActionModeCallback mainFolderActionModeCallback;
@Inject FileHelper fileHelper;
@Inject ClipboardHelper clipboardHelper;
@Inject ViewModelProvider.Factory viewModelFactory;
@Inject MainVerticalNavigationAdapter mainVerticalNavigationAdapter;
@Inject XmlParser<OptionItem> xmlParser;
// Objects
public MainActivityComponent daggerMainActivityComponent;
private ActivityMainBinding binding;
private MainViewModel mainViewModel;
private MainFolderViewModel mainFolderViewModel;
private MainNotebookViewModel mainNotebookViewModel;
private GestureDetectorCompat gestureDetectorCompat;
private MenuItem searchMenuItem;
private SelectionTracker<Long> verticalNavigationSelectionTracker;
private NavController navController;
// Variables
private boolean isBackPressed = false;
// =============================================================================================
//region Base methods
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(
this,
R.layout.activity_main,
new BindingComponent(this));
binding.setLifecycleOwner(this);
// Set the main dagger component
daggerMainActivityComponent = ((InkNotesApplication) getApplication())
.component()
.mainActivityComponentFactory()
.create(this);
daggerMainActivityComponent.inject(this);
// Get all viewModels
mainViewModel = new ViewModelProvider(this, viewModelFactory).get(MainViewModel.class);
mainFolderViewModel = new ViewModelProvider(this, viewModelFactory).get(MainFolderViewModel.class);
mainNotebookViewModel = new ViewModelProvider(this, viewModelFactory).get(MainNotebookViewModel.class);
// Set the default file
mainViewModel.setDefaultFile(getExternalFilesDir("notes"));
mainViewModel.setCurrentFile(getExternalFilesDir("notes"));
gestureDetectorCompat = new GestureDetectorCompat(this, new GestureListener());
// Set variables of binding
binding.setHandler(this);
binding.setViewModel(mainViewModel);
// Setup main toolbar
setSupportActionBar(binding.includedAppbarMain.materialToolbarMainAppbar);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_24dp);
// Setup explorer toolbar
binding.includedAppbarFolder.materialToolbarFolder.setOnMenuItemClickListener(this::onOptionsItemSelected);
// Setup drawer and navigation layout
binding.navigationViewMainFolder.setVisibility(View.GONE);
if (binding.drawerLayoutMain != null) {
binding.drawerLayoutMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
binding.drawerLayoutMain.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (mainFolderActionModeCallback != null) {
mainFolderActionModeCallback.finish();
}
}
});
}
// Setup navigation
navController = Navigation.findNavController(this, R.id.fragment_main_layout_nav_host);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
navController.getGraph()
).build();
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
if (binding.includedAppbarMain.bottomNavigationViewMainAppbar != null) {
NavigationUI.setupWithNavController(binding.includedAppbarMain.bottomNavigationViewMainAppbar, navController);
}
// Set the explorer and file card fragment
/*
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_main_layout_fragment_container, mainHomeFragment).commit();*/
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_main_folder_container, mainFolderFragment).commit();
// Setup the floating action button
binding.includedAppbarMain.speedDialViewMainAppbar.inflate(R.menu.activity_main_fab);
binding.includedAppbarMain.speedDialViewMainAppbar.setOnActionSelectedListener(this);
// Setup bottom navigation view
if (binding.includedAppbarMain.bottomNavigationViewMainAppbar != null) {
binding.includedAppbarMain.bottomNavigationViewMainAppbar.setOnNavigationItemSelectedListener(this);
}
// Setup the vertical navigation view
if (binding.recyclerViewMainVerticalNavigation != null) {
binding.recyclerViewMainVerticalNavigation.setAdapter(mainVerticalNavigationAdapter);
List<OptionItem> items = xmlParser.parse(getResources().getXml(R.xml.menu_main_vertical_navigation), OptionItem.class);
// Create the selection tracker
// Add observer to the selection tracker
mainVerticalNavigationAdapter.setSelectionTracker(verticalNavigationSelectionTracker);
verticalNavigationSelectionTracker.select((long) R.id.action_activity_main_vertical_navigation_home);
mainVerticalNavigationAdapter.submitList(items);
binding.includedAppbarMain.speedDialViewMainAppbar.setVisibility(View.INVISIBLE);
toggleFolderNavigationView(View.VISIBLE);
}
}
@Override
public void onBackPressed() {
if (binding.drawerLayoutMain != null) {
if (binding.drawerLayoutMain.isDrawerOpen(GravityCompat.START)) {
binding.drawerLayoutMain.closeDrawer(GravityCompat.START);
}
}
super.onBackPressed();
}
@Override
public boolean onSupportNavigateUp() {
if (binding.drawerLayoutMain != null) {
return NavigationUI.navigateUp(navController, binding.drawerLayoutMain);
}
return super.onSupportNavigateUp();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetectorCompat.onTouchEvent(event);
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(@NonNull MotionEvent event) {
super.dispatchTouchEvent(event);
return gestureDetectorCompat.onTouchEvent(event);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
selectNavigationItem(item.getItemId());
return true;
}
//endregion
// =============================================================================================
//region Custom methods
private void selectNavigationItem(int id) {
switch (id) {
case R.id.action_activity_main_home:
case R.id.action_activity_main_vertical_navigation_home:
//navController.navigate(R.id.action_activity_main_home);
if (binding.drawerLayoutMain != null) {
binding.drawerLayoutMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(false);
if (searchMenuItem != null) {
searchMenuItem.collapseActionView();
}
binding.includedAppbarMain.appBarLayoutMainAppbar.setExpanded(true);
binding.includedAppbarMain.speedDialViewMainAppbar.setVisibility(View.INVISIBLE);
toggleFolderNavigationView(View.VISIBLE);
break;
case R.id.action_activity_main_notebooks:
case R.id.action_activity_main_vertical_navigation_notebooks:
//navController.navigate(R.id.action_activity_main_notebooks);
if (binding.drawerLayoutMain != null) {
binding.drawerLayoutMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
if (searchMenuItem != null) {
searchMenuItem.collapseActionView();
}
binding.includedAppbarMain.appBarLayoutMainAppbar.setExpanded(true);
binding.includedAppbarMain.speedDialViewMainAppbar.setVisibility(View.VISIBLE);
toggleFolderNavigationView(View.GONE);
break;
case R.id.action_activity_main_search:
case R.id.action_activity_main_vertical_navigation_search:
//navController.navigate(R.id.action_activity_main_search);
if (binding.drawerLayoutMain != null) {
binding.drawerLayoutMain.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(false);
if (searchMenuItem != null) {
searchMenuItem.expandActionView();
}
binding.includedAppbarMain.appBarLayoutMainAppbar.setExpanded(false);
binding.includedAppbarMain.speedDialViewMainAppbar.setVisibility(View.INVISIBLE);
toggleFolderNavigationView(View.VISIBLE);
break;
}
isBackPressed = false;
}
在 selectNavigationItem 方法中,您还可以看到我测试了使用 navController.navigate(R.id.action_activity_main_notebooks);
进行手动导航,该方法有效但弹出后台堆栈也无效。但是使用 NavigationUI.setupWithNavController(binding.includedAppbarMain.bottomNavigationViewMainAppbar, navController);
设置 BottomNavigationView 应该不需要调用 navigate。
主页 fragment :
@MainActivityScope
public class MainHomeFragment extends Fragment {
public final static String NAME = "MainHomeFragment";
@Inject
public MainHomeFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main_home, container, false);
}
}
笔记本 fragment :
@MainActivityScope
public class MainNotebookFragment extends Fragment {
// Static variables
public final static String NAME = "MainNotebookFragment";
private static final String ARG_COLUMN_COUNT = "column-count";
// Injected objects
@Inject ViewModelProvider.Factory viewModelFactory;
@Inject MainNotebookAdapter mainNotebookAdapter;
@Inject MainNotebookItemTouchHelperCallback mainNotebookItemTouchHelperCallback;
// Objects
private RecyclerView recyclerView;
private MainNotebookViewModel mainNotebookViewModel;
// Variables
private int columnCount = 4;
@Inject
public MainNotebookFragment() {
}
// =============================================================================================
//region Base methods
@Override
public void onCreate(Bundle savedInstanceState) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
columnCount = getResources().getInteger(R.integer.column_count_portrait);
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
columnCount = getResources().getInteger(R.integer.column_count_landscape);
}
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main_notebook, container, false);
((MainActivity) requireActivity()).daggerMainActivityComponent.inject(this);
mainNotebookViewModel = new ViewModelProvider(requireActivity(), viewModelFactory).get(MainNotebookViewModel.class);
if (getArguments() != null) {
columnCount = getArguments().getInt(ARG_COLUMN_COUNT);
}
// Set the mainNotebookAdapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
recyclerView = (RecyclerView) view;
if (columnCount <= 1) {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
} else {
recyclerView.setLayoutManager(new GridLayoutManager(context, columnCount));
}
recyclerView.setAdapter(mainNotebookAdapter);
}
// Set the item touch helper
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mainNotebookItemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mainNotebookViewModel.getItems().observe(
getViewLifecycleOwner(),
fileCardItems -> mainNotebookAdapter.setItems(fileCardItems)
);
mainNotebookViewModel.getSelectedItems().observe(
getViewLifecycleOwner(),
selectedExplorerItems -> mainNotebookAdapter.setSelectedItems(selectedExplorerItems)
);
mainNotebookViewModel.getQueryText().observe(
getViewLifecycleOwner(),
queryText -> mainNotebookAdapter.getFilter().filter(queryText)
);
}
@Override
public void onResume() {
super.onResume();
if (!EventBus.getDefault().isRegistered(mainNotebookAdapter)) {
EventBus.getDefault().register(mainNotebookAdapter);
}
}
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(mainNotebookAdapter);
}
//endregion
}
搜索 fragment :
@MainActivityScope
public class MainSearchFragment extends Fragment {
public final static String NAME = "MainSearchFragment";
@Inject
public MainSearchFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main_search, container, false);
}
}
最佳答案
我终于找到了解决方案,问题出在 onNavigationItemSelected
函数上。因此,从 MainActivity 中删除这两个部分可以解决问题:
if (binding.includedAppbarMain.bottomNavigationViewMainAppbar != null) {
binding.includedAppbarMain.bottomNavigationViewMainAppbar.setOnNavigationItemSelectedListener(this);
}
...
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
selectNavigationItem(item.getItemId());
return true;
}
或者我所做的,因为我仍然需要该函数,返回 NavigationUI.onNavDestinationSelected(item, navController)
而不是 true。
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
selectNavigationItem(item.getItemId());
return NavigationUI.onNavDestinationSelected(item, navController);
}
关于android - 带有导航组件的 BottomNavigationView - 选定的 fragment 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63220118/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!