带有 MVVM 方式片段的 BottomNavigationView

Med*_*det 5 java android mvvm deeplink

我们有底部导航选项卡 (4),每个选项卡中都有片段。任何人都可以帮助(给出想法)如何以 MVVM 方式设计结构,同时保持每个选项卡的片段状态。我知道这不是提出糟糕问题的地方,但我正在寻找概念性建议。以最好的方式完成它。

Har*_*sar -3

\n

Google(通过Nick Butcher\xe2\x80\x8f)宣布发布 Android 设计支持库 v25,其中包括新的 BottomNavigationView。

\n
\n\n

菜单.xml

\n\n

在菜单资源文件中定义导航项(Fragments 项)

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<menu xmlns:android="http://schemas.android.com/apk/res/android"\nxmlns:app="http://schemas.android.com/apk/res-auto">\n<item\n    android:id="@+id/action_item1"\n    android:icon="@drawable/icon1"\n    android:title="Menu1"\n/>\n<item\n\n    android:id="@+id/action_item2"\n    android:icon="@drawable/icon2"\n    android:title="Menu2"/>\n<item\n    android:id="@+id/action_item3"\n    android:icon="@drawable/icon3"\n    android:title="Menu3" />\n<item\n    android:id="@+id/action_item4"\n    android:icon="@drawable/icon4"\n    android:title="Menu4" />\n\n</menu>\n
Run Code Online (Sandbox Code Playgroud)\n\n

活动主文件

\n\n

将实际添加 BottomNavigationView到布局中。

\n\n
  <RelativeLayout\n    android:layout_width="match_parent"\n    android:layout_height="match_parent"\n    android:orientation="vertical">\n    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"\n        xmlns:local="http://schemas.android.com/apk/res-auto"\n        android:id="@+id/toolbar"\n        android:layout_width="match_parent"\n        android:layout_height="wrap_content"\n        android:minHeight="?attr/actionBarSize"\n        android:background="@color/colorPrimary"\n        local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"\n        local:popupTheme="@style/ThemeOverlay.AppCompat.Light" />\n\n\n    <FrameLayout\n        android:id="@+id/frame_layout"\n        android:layout_width="match_parent"\n        android:layout_height="match_parent"\n        android:layout_above="@+id/navigation"\n        android:layout_below="@id/toolbar"\n        android:animateLayoutChanges="true">\n\n    </FrameLayout>\n\n    <android.support.design.widget.BottomNavigationView\n        android:id="@+id/navigation"\n        android:layout_width="match_parent"\n        android:layout_height="wrap_content"\n        android:layout_alignParentBottom="true"\n        android:background="@drawable/rbtn_selector"\n        android:paddingTop="@dimen/_2sdp"\n        app:itemIconTint="@drawable/selector_bottom"\n        app:itemTextColor="@drawable/selector_bottom"\n        app:elevation="@dimen/_8sdp"\n        app:menu="@menu/menu"/>\n\n\n</RelativeLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

MainActivity.java

\n\n
public class MainActivity extends AppCompatActivity {\n\n        bottomNavigationView = (BottomNavigationView)findViewById(R.id.navigation);\n\n  //If you want to remove slide animation of bottomview  with Helper Class \n\n BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);\n        Menu m = bottomNavigationView.getMenu();\n\n\n bottomNavigationView.setOnNavigationItemSelectedListener\n            (new BottomNavigationView.OnNavigationItemSelectedListener() {\n                @Override\n                public boolean onNavigationItemSelected(@NonNull MenuItem item) {\n\n\n                    if (getSupportActionBar() != null){\n                        getSupportActionBar().setDisplayHomeAsUpEnabled(false);\n                        getSupportActionBar().setHomeButtonEnabled(false);\n                    }\n\n\n\n                    android.app.Fragment selectedFragment = null;\n                    switch (item.getItemId()) {\n                        case R.id.action_item1:\n                            selectedFragment = Fragment1.newInstance();\n                            toolbar.setTitle("Fragment1");\n                            break;\n                        case R.id.action_item2:\n                            selectedFragment = Fragment2.newInstance();\n                            toolbar.setTitle("Fragment2");\n                            break;\n                        case R.id.action_item3:\n                            selectedFragment = Fragment3.newInstance();\n                            toolbar.setTitle("Fragment3");\n                            break;\n                        case R.id.action_item4:\n                            selectedFragment = Fragment4.newInstance();\n                            toolbar.setTitle("Fragment4");\n                            break;\n                        default:\n                            selectedFragment = Fragment1.newInstance();\n                            toolbar.setTitle("Fragment1");\n                            break;\n\n                    }\n                    android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();\n                    transaction.replace(R.id.frame_layout, selectedFragment);\n                    transaction.commit();\n                    return true;\n                }\n            });\n\n    //Manually displaying the first fragment - one time only\n\n\n\n    android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();\n    transaction.replace(R.id.frame_layout, Fragment1.newInstance());\n    transaction.commit();\n\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

此辅助类用于删除移动动画

\n\n
static class BottomNavigationViewHelper {\n\n    public static void removeShiftMode(BottomNavigationView view) {\n        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);\n        try {\n            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");\n            shiftingMode.setAccessible(true);\n            shiftingMode.setBoolean(menuView, false);\n            shiftingMode.setAccessible(false);\n            for (int i = 0; i < menuView.getChildCount(); i++) {\n                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);\n             item.setShiftingMode(false);\n                // set once again checked value, so view will be updated\n                item.setChecked(item.getItemData().isChecked());\n            }\n        } catch (NoSuchFieldException e) {\n            Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field");\n        } catch (IllegalAccessException e) {\n            Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode");\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个 Fragment 作为一个菜单项 **Fragmen1.java**

\n\n
public class Fragmen1 extends android.app.Fragment {\n\npublic static Fragmen1 newInstance() {\n    Fragmen1 fragment = new Fragmen1();\n    return fragment;\n}\n  @Override\npublic void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setHasOptionsMenu(true);\n}\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这甚至不是 MVVM。 (5认同)