แถบนำทางด้านล่างใหม่ของ Android หรือ BottomNavigationView


134

เห็นแนวทางใหม่ออกมาและใช้ในgoogle photosแอพล่าสุด ไม่รู้จะใช้แถบนำทางด้านล่างใหม่ได้อย่างไร ดู lib สนับสนุนใหม่ไม่พบลูกค้าเป้าหมายใด ๆ

ป้อนคำอธิบายภาพที่นี่

ไม่พบตัวอย่างเป็นทางการใด ๆ

จะใช้แถบด้านล่างใหม่ได้อย่างไร? ไม่ต้องการปรับแต่งใด ๆ


เยี่ยมชมนี้: stackoverflow.com/questions/36019986/…
Fartab

คุณสามารถดูคำตอบของฉัน: stackoverflow.com/a/44967021/2412582
Prashant

คำตอบ:


177

ฉันคิดว่าคุณอาจกำลังมองหาสิ่งนี้

นี่คือตัวอย่างสั้น ๆ ในการเริ่มต้น:

public class MainActivity extends AppCompatActivity {
    private BottomBar mBottomBar;

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

        // Notice how you don't use the setContentView method here! Just
        // pass your layout to bottom bar, it will be taken care of.
        // Everything will be just like you're used to.
        mBottomBar = BottomBar.bind(this, R.layout.activity_main,
                savedInstanceState);

        mBottomBar.setItems(
                new BottomBarTab(R.drawable.ic_recents, "Recents"),
                new BottomBarTab(R.drawable.ic_favorites, "Favorites"),
                new BottomBarTab(R.drawable.ic_nearby, "Nearby"),
                new BottomBarTab(R.drawable.ic_friends, "Friends")
        );

        mBottomBar.setOnItemSelectedListener(new OnTabSelectedListener() {
            @Override
            public void onItemSelected(final int position) {
                // the user selected a new tab
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mBottomBar.onSaveInstanceState(outState);
    }
}

นี่คือลิงค์อ้างอิง

https://github.com/roughike/BottomBar

แก้ไขข่าวใหม่

มุมมองการนำทางด้านล่างอยู่ในแนวทางการออกแบบวัสดุมาระยะหนึ่งแล้ว แต่เราไม่ง่ายเลยที่จะนำไปใช้ในแอปของเรา แอปพลิเคชันบางตัวได้สร้างโซลูชันของตนเองในขณะที่แอปพลิเคชันอื่น ๆ ใช้ไลบรารีโอเพนซอร์สของบุคคลที่สามเพื่อทำงานให้สำเร็จ ตอนนี้ไลบรารีสนับสนุนการออกแบบกำลังเพิ่มแถบนำทางด้านล่างนี้มาดูวิธีใช้งานกัน

วิธีใช้ ?

ในการเริ่มต้นเราต้องอัปเดตการพึ่งพาของเรา!

compilecom.android.support:design:25.0.0

ออกแบบ xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Content Container -->

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/bottom_navigation_main" />

</RelativeLayout>

สร้างเมนูตามความต้องการของคุณ

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorites"
        android:enabled="true"
        android:icon="@drawable/ic_favorite_white_24dp"
        android:title="@string/text_favorites"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_schedules"
        android:enabled="true"
        android:icon="@drawable/ic_access_time_white_24dp"
        android:title="@string/text_schedules"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_music"
        android:enabled="true"
        android:icon="@drawable/ic_audiotrack_white_24dp"
        android:title="@string/text_music"
        app:showAsAction="ifRoom" />
</menu>

การจัดการสถานะที่เปิดใช้งาน / ปิดใช้งาน สร้างไฟล์ตัวเลือก

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
      android:state_checked="true"
      android:color="@color/colorPrimary" />
  <item
      android:state_checked="false"
      android:color="@color/grey" />
 </selector>

จัดการเหตุการณ์การคลิก

BottomNavigationView bottomNavigationView = (BottomNavigationView)
                findViewById(R.id.bottom_navigation);

bottomNavigationView.setOnNavigationItemSelectedListener(
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_favorites:

                        break;
                    case R.id.action_schedules:

                        break;
                    case R.id.action_music:

                        break;
                }
                return false;
            }
});

แก้ไข: การใช้ Androidx คุณต้องเพิ่มการอ้างอิงด้านล่าง

implementation 'com.google.android.material:material:1.2.0-alpha01'

เค้าโครง

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_width="match_parent"
             android:layout_height="match_parent">
    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:layout_gravity="bottom"
            app:menu="@menu/bottom_navigation_menu"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</FrameLayout>

หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับวิธีการและวิธีการทำงานอ่านสิ่งนี้

แน่นอนมันจะช่วยคุณ


แถบด้านล่างในตัวอย่างยังคงปรับแต่งด้วยตัวคุณเองวิธีใด ๆ ในการใช้ Android lib ต้นทาง ฉันคิดว่ามันอาจอยู่ในการสนับสนุน lib หรือยังไม่เปิดเผยต่อสาธารณะ?
zjywill

@zjywill ไม่ได้ปรับแต่ง แต่เป็นวิธีใช้ฟังก์ชันแถบนำทางด้านล่างอย่างเป็นทางการในแอปของเรา เพียงแค่ลองใช้รหัสนี้
Jay Rathod RJ

1
ฉันไม่แนะนำให้คุณใช้แถบด้านล่างแบบหยาบเนื่องจาก API ไม่ได้ใช้งานอย่างสมบูรณ์และฉันพบปัญหาในการแสดงผล คุณไม่สามารถเปลี่ยนไอคอนขณะรันไทม์ได้และยังคงเพิกเฉยต่อสีที่ฉันตั้งไว้สำหรับพื้นหลังของปุ่ม
Alon Kogan

โปรดตอบว่าฉันจะบันทึกประวัติศาสตร์ได้อย่างไร
Mitul Goti

1
การสะท้อน java บน mShiftingMode ช่วยฉันได้! ฉันไม่รู้ว่าพวกเขากำลังคิดอะไรโดยไม่เปิดเผยฟิลด์นี้
Banana droid

48

คุณควรใช้BottomNavigationViewจาก v25 Android Support Library เป็นแถบนำทางด้านล่างมาตรฐานสำหรับแอปพลิเคชัน

นี่คือโพสต์บนสื่อที่มีคำแนะนำทีละขั้นตอน: https://medium.com/@hitherejoe/exploring-the-android-design-support-library-bottom-navigation-drawer-548de699e8e0#.9vmiekxze


2
stackoverflow.com/questions/40153888/… สวัสดี maxim .. ฉันใช้สิ่งนี้ แต่มันไม่ปรากฏขึ้น ..
Sagar Chavada

@SagarChavada คุณอาจต้องการดูในโพสต์
Maksim Turaev

5
@DroidDev นั่นเป็นเพราะ BottomNavigationView เปิดตัวในวันที่โพสต์คำตอบนี้ ก่อนหน้านั้นมีเพียงโซลูชันของบุคคลที่สามเท่านั้น

คุณรู้หรือไม่ว่าคุณสามารถกำหนดมุมมองแบบกำหนดเองโดยใช้อะแดปเตอร์ได้หรือไม่?
Radu

1
@Alan ดูเหมือนว่า BottomNavigationView เป็นส่วนหนึ่งของไลบรารีการสนับสนุนซึ่งรองรับขั้นต่ำ API ระดับ 9 ดังนั้นฉันเดาว่ามันจะใช้งานได้ คุณยังสามารถตรวจสอบบนโปรแกรมจำลองเพื่อให้แน่ใจได้ 100%
Maksim Turaev

20

คำตอบเดิมของฉันจัดการกับBottomNavigationViewแต่ตอนนี้มีBottomAppBar. ฉันเพิ่มส่วนที่ด้านบนสำหรับส่วนนั้นด้วยลิงก์การใช้งาน

แถบ App ด้านล่าง

BottomAppBarสนับสนุนการดำเนินการลอยตัวปุ่ม

ป้อนคำอธิบายภาพที่นี่

ภาพจากที่นี่ ดูเอกสารและบทช่วยสอนนี้สำหรับความช่วยเหลือในการตั้งค่าไฟล์BottomAppBar.

มุมมองการนำทางด้านล่าง

ตัวอย่างเต็มต่อไปนี้แสดงวิธีทำให้มุมมองการนำทางด้านล่างคล้ายกับภาพในคำถาม ดูการนำทางด้านล่างในเอกสารประกอบ

ป้อนคำอธิบายภาพที่นี่

เพิ่มไลบรารีสนับสนุนการออกแบบ

เพิ่มบรรทัดนี้ในไฟล์build.gradeของแอปถัดจากสิ่งที่ไลบรารีสนับสนุนอื่น ๆ

implementation 'com.android.support:design:28.0.0'

แทนที่หมายเลขเวอร์ชันด้วยสิ่งที่เป็นปัจจุบัน

สร้างเค้าโครงกิจกรรม

สิ่งพิเศษเพียงอย่างเดียวที่เราได้เพิ่มเข้าไปในเค้าโครงคือไฟล์BottomNavigationView. หากต้องการเปลี่ยนสีของไอคอนและข้อความเมื่อคลิกคุณสามารถใช้selectorแทนการระบุสีโดยตรง สิ่งนี้ถูกละไว้เพื่อความเรียบง่ายที่นี่

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:menu="@menu/bottom_nav_menu"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@android:color/white"
        app:itemTextColor="@android:color/white" />

</RelativeLayout>

สังเกตว่าเราเคยlayout_alignParentBottomใส่ไว้ด้านล่างจริงๆ

กำหนดรายการเมนู

XML bottom_nav_menuที่ข้างต้นสำหรับการนำทางด้านล่างดูจะเรียกว่า นี่คือสิ่งที่กำหนดแต่ละรายการในมุมมองของเรา เราจะทำให้ตอนนี้ สิ่งที่คุณต้องทำคือเพิ่มทรัพยากรเมนูเช่นเดียวกับที่คุณทำสำหรับ Action Bar หรือ Toolbar

bottom_nav_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_recents"
        android:enabled="true"
        android:icon="@drawable/ic_action_recents"
        android:title="Recents"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_favorites"
        android:enabled="true"
        android:icon="@drawable/ic_action_favorites"
        android:title="Favorites"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_nearby"
        android:enabled="true"
        android:icon="@drawable/ic_action_nearby"
        android:title="Nearby"
        app:showAsAction="ifRoom" />
</menu>

คุณจะต้องเพิ่มไอคอนที่เหมาะสมให้กับโครงการของคุณ นี่ไม่ใช่เรื่องยากหากคุณไปที่File> New> Image Assetแล้วเลือกAction Bar และ Tab Iconsเป็น Icon Type

เพิ่มรายการที่เลือกฟัง

ไม่มีอะไรพิเศษเกิดขึ้นที่นี่ เราเพียงแค่เพิ่มผู้ฟังลงในแถบนำทางด้านล่างในonCreateวิธีการของกิจกรรม

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_recents:
                        Toast.makeText(MainActivity.this, "Recents", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_favorites:
                        Toast.makeText(MainActivity.this, "Favorites", Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_nearby:
                        Toast.makeText(MainActivity.this, "Nearby", Toast.LENGTH_SHORT).show();
                        break;

                }
                return true;
            }
        });
    }
}

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่?

ฉันได้เรียนรู้วิธีการดูวิดีโอ YouTube ต่อไปนี้ เสียงคอมพิวเตอร์แปลก ๆ เล็กน้อย แต่การสาธิตชัดเจนมาก


16

คุณยังสามารถใช้เค้าโครงแท็บกับมุมมองแท็บที่กำหนดเองเพื่อให้บรรลุสิ่งนี้

custom_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:paddingTop="8dp">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:scaleType="centerInside"
        android:src="@drawable/ic_recents_selector" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:textAllCaps="false"
        android:textColor="@color/tab_color"
        android:textSize="12sp"/>
</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.view.ViewPager

        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        style="@style/AppTabLayout"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="?attr/colorPrimary" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private TabLayout mTabLayout;

    private int[] mTabsIcons = {
            R.drawable.ic_recents_selector,
            R.drawable.ic_favorite_selector,
            R.drawable.ic_place_selector};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Setup the viewPager
        ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
        MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);

        mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
        mTabLayout.setupWithViewPager(viewPager);

        for (int i = 0; i < mTabLayout.getTabCount(); i++) {
            TabLayout.Tab tab = mTabLayout.getTabAt(i);
            tab.setCustomView(pagerAdapter.getTabView(i));
        }

        mTabLayout.getTabAt(0).getCustomView().setSelected(true);
    }


    private class MyPagerAdapter extends FragmentPagerAdapter {

        public final int PAGE_COUNT = 3;

        private final String[] mTabsTitle = {"Recents", "Favorites", "Nearby"};

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        public View getTabView(int position) {
            // Given you have a custom layout in `res/layout/custom_tab.xml` with a TextView and ImageView
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_tab, null);
            TextView title = (TextView) view.findViewById(R.id.title);
            title.setText(mTabsTitle[position]);
            ImageView icon = (ImageView) view.findViewById(R.id.icon);
            icon.setImageResource(mTabsIcons[position]);
            return view;
        }

        @Override
        public Fragment getItem(int pos) {
            switch (pos) {

                case 0:
                    return PageFragment.newInstance(1);

                case 1:
                    return PageFragment.newInstance(2);
                case 2:
                    return PageFragment.newInstance(3);

            }
            return null;
        }

        @Override
        public int getCount() {
            return PAGE_COUNT;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mTabsTitle[position];
        }
    }

}

ดาวน์โหลด Complete Sample Project


8
ตามแนวทางการออกแบบของ Google ไม่ควรใช้การเลื่อนเพื่อสลับระหว่างแท็บ google.com/design/spec/components/…
Carl B

1
จะดีมากถ้าคุณให้เครดิตผู้เขียนที่เขียนพฤติกรรม :)
Nikola Despotoski

13

Google ได้เปิดตัว BottomNavigationView หลังจากเวอร์ชัน 25.0.0 ของไลบรารีสนับสนุนการออกแบบ แต่มีข้อ จำกัด ดังต่อไปนี้:

  1. คุณไม่สามารถลบชื่อเรื่องและไอคอนกลางได้
  2. คุณไม่สามารถเปลี่ยนขนาดตัวอักษรของชื่อเรื่อง
  3. โมเตล
  4. ไม่มี BottomNavigationBehavior: ดังนั้นจึงไม่มีการรวมกับ FAB หรือ SnackBar ผ่าน CordinatorLayout
  5. ทุกเมนูเป็นส่วนขยายที่แท้จริงของ FrameLayout ดังนั้นจึงไม่มีเอฟเฟกต์การเปิดเผยวงกลมที่ดี

ดังนั้นสูงสุดที่คุณสามารถทำได้กับ BottomNavigationView เวอร์ชันกำปั้นนี้คือ: (ไม่มีการสะท้อนหรือใช้ lib ด้วยตัวเอง)

ป้อนคำอธิบายภาพที่นี่

ดังนั้นหากคุณต้องการสิ่งเหล่านี้ คุณสามารถใช้ไลบรารีส่วนที่สามเช่นroughike / BottomBarหรือใช้ lib ด้วยตัวเอง


4
สำหรับบันทึกคุณสามารถเปลี่ยนสีพื้นหลังและคุณสามารถเปลี่ยนขนาดข้อความชื่อเรื่องได้ (ฉันพบปัญหาอื่น ๆ เกี่ยวกับวิธีที่ฉันใช้) การใช้ android: background = "xxx" จะเปลี่ยนสีพื้นหลัง แต่หากคุณระบุapp:itemBackground="xxx"รายการทั้งหมดที่แชร์สีนี้และคุณจะไม่เห็นพื้นหลัง (เว้นแต่คุณจะเพิ่มความโปร่งใส แต่ยังคงไอคอนทั้งหมดจะมีสีเดียวกัน) . แย่มากที่ทีมแอนดรอยด์ปล่อยส่วนประกอบเส็งเคร็งแบบนี้…เสร็จสมบูรณ์ 75% เสมอพลาดไมล์พิเศษที่จะทำให้มันยอดเยี่ยม
Martin Marconcini

เราสามารถเปลี่ยนสีพื้นหลังได้
สตีฟ

สวัสดีฉันใช้ lib เดียวกันและใช้งานได้ดี แต่ที่นี่ฉันต้องการแสดงเฉพาะไอคอนที่ไม่มีชื่อตรงกลางแถบด้านล่าง เป็นไปได้ไหม? และฉันได้พยายามใส่ว่างในรายการเมนูแล้ว แต่ไอคอนยังคงแสดงอยู่ด้านบนเท่านั้น ฉันจะแสดงเฉพาะไอคอนที่ไม่มีชื่อเรื่องตรงกลางแถบด้านล่างได้อย่างไร
user512

สวัสดีโปรดตรวจสอบคำตอบของฉันที่นี่stackoverflow.com/questions/40183239/…
Sanf0rd

@MartinMarconcini คุณเปลี่ยนขนาดตัวอักษรสำหรับมุมมองการนำทางด้านล่างได้อย่างไร
Ponsuyambu Velladurai

10

ในฐานะที่เป็น Sanf0rd กล่าว Google เปิดตัวBottomNavigationViewเป็นส่วนหนึ่งของรุ่นห้องสมุดการสนับสนุนการออกแบบ 25.0.0 ข้อ จำกัด ที่เขากล่าวถึงนั้นส่วนใหญ่เป็นความจริงยกเว้นว่าคุณสามารถเปลี่ยนสีพื้นหลังของมุมมองและแม้แต่สีข้อความและสีของไอคอนได้ นอกจากนี้ยังมีภาพเคลื่อนไหวเมื่อคุณเพิ่มมากกว่า 4 รายการ (น่าเสียดายที่ไม่สามารถเปิดหรือปิดใช้งานด้วยตนเองได้)

ฉันเขียนบทช่วยสอนโดยละเอียดพร้อมตัวอย่างและที่เก็บข้อมูลซึ่งคุณสามารถอ่านได้ที่นี่: https://blog.autsoft.hu/now-you-can-use-the-bottom-navigation-view-in-the- ออกแบบสนับสนุนห้องสมุด /


ส่วนสำคัญของมัน

คุณต้องเพิ่มสิ่งเหล่านี้ในระดับแอปของคุณbuild.gradle:

compile 'com.android.support:appcompat-v7:25.0.0'  
compile 'com.android.support:design:25.0.0'

คุณสามารถรวมไว้ในเค้าโครงของคุณได้ดังนี้:

<android.support.design.widget.BottomNavigationView  
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/bottom_navigation_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:itemBackground="@color/darkGrey"
        app:itemIconTint="@color/bottom_navigation_item_background_colors"
        app:itemTextColor="@color/bottom_navigation_item_background_colors"
        app:menu="@menu/menu_bottom_navigation" />

คุณสามารถระบุรายการผ่านทรัพยากรเมนูดังนี้:

<?xml version="1.0" encoding="utf-8"?>  
<menu  
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_one"
        android:icon="@android:drawable/ic_dialog_map"
        android:title="One"/>
    <item
        android:id="@+id/action_two"
        android:icon="@android:drawable/ic_dialog_info"
        android:title="Two"/>
    <item
        android:id="@+id/action_three"
        android:icon="@android:drawable/ic_dialog_email"
        android:title="Three"/>
    <item
        android:id="@+id/action_four"
        android:icon="@android:drawable/ic_popup_reminder"
        android:title="Four"/>
</menu>

และคุณสามารถตั้งค่าสีอ่อนและสีข้อความเป็นรายการสีได้ดังนั้นรายการที่เลือกในปัจจุบันจึงถูกเน้น:

<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:color="@color/colorAccent"
        android:state_checked="false"/>
    <item
        android:color="@android:color/white"
        android:state_checked="true"/>

</selector>

สุดท้ายคุณสามารถจัดการกับการเลือกรายการด้วย OnNavigationItemSelectedListener:

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {  
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment = null;
        switch (item.getItemId()) {
            case R.id.action_one:
                // Switch to page one
                break;
            case R.id.action_two:
                // Switch to page two
                break;
            case R.id.action_three:
                // Switch to page three
                break;
        }
        return true;
    }
});

1
ยอดเยี่ยม! คำแนะนำ - ลบแอป: itemBackground = "@ color / darkGrey" เพื่อให้ได้เอฟเฟกต์ระลอกคลื่นแบบวงกลมดั้งเดิม
Gark

8

ห้องสมุดทางเลือกอื่น ๆ ที่คุณสามารถลองได้: - https://github.com/Ashok-Varma/BottomNavigation

<com.ashokvarma.bottomnavigation.BottomNavigationBar
    android:layout_gravity="bottom"
    android:id="@+id/bottom_navigation_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

BottomNavigationBar bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);

bottomNavigationBar
                .addItem(new BottomNavigationItem(R.drawable.ic_home_white_24dp, "Home"))
                .addItem(new BottomNavigationItem(R.drawable.ic_book_white_24dp, "Books"))
                .addItem(new BottomNavigationItem(R.drawable.ic_music_note_white_24dp, "Music"))
                .addItem(new BottomNavigationItem(R.drawable.ic_tv_white_24dp, "Movies & TV"))
                .addItem(new BottomNavigationItem(R.drawable.ic_videogame_asset_white_24dp, "Games"))
                .initialise();

1
ห้องสมุดอื่นที่คล้ายกันคือ AHBottomNavigation: github.com/aurelhubert/ahbottomnavigation
ninjahoahong

3

ฉันคิดว่านี่เป็นประโยชน์เช่นกัน

ตัวอย่างข้อมูล

public class MainActivity : AppCompatActivity, BottomNavigationBar.Listeners.IOnTabSelectedListener
{
    private BottomBar _bottomBar;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.MainActivity);

        _bottomBar = BottomBar.Attach(this, bundle);
        _bottomBar.SetItems(
            new BottomBarTab(Resource.Drawable.ic_recents, "Recents"),
            new BottomBarTab(Resource.Drawable.ic_favorites, "Favorites"),
            new BottomBarTab(Resource.Drawable.ic_nearby, "Nearby")
        );
        _bottomBar.SetOnItemSelectedListener(this);
        _bottomBar.HideShadow();
        _bottomBar.UseDarkTheme(true);
        _bottomBar.SetTypeFace("Roboto-Regular.ttf");

        var badge = _bottomBar.MakeBadgeForTabAt(1, Color.ParseColor("#f02d4c"), 1);
        badge.AutoShowAfterUnSelection = true;
    }

    public void OnItemSelected(int position)
    {

    }

    protected override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);

        // Necessary to restore the BottomBar's state, otherwise we would
        // lose the current tab on orientation change.
        _bottomBar.OnSaveInstanceState(outState);
    }
}

ลิงค์

https://github.com/pocheshire/BottomNavigationBar

มันhttps://github.com/roughike/BottomBarรังเพลิง C # สำหรับนักพัฒนา Xamarin


3

ฉันสร้างคลาสส่วนตัวซึ่งใช้มุมมองตารางและทรัพยากรเมนู:

private class BottomBar {

    private GridView mGridView;
    private Menu     mMenu;
    private BottomBarAdapter mBottomBarAdapter;
    private View.OnClickListener mOnClickListener;

    public BottomBar (@IdRes int gridviewId, @MenuRes int menuRes,View.OnClickListener onClickListener) {
        this.mGridView = (GridView) findViewById(gridviewId);
        this.mMenu = getMenu(menuRes);
        this.mOnClickListener = onClickListener;

        this.mBottomBarAdapter = new BottomBarAdapter();
        this.mGridView.setAdapter(mBottomBarAdapter);
    }

    private Menu getMenu(@MenuRes int menuId) {
        PopupMenu p = new PopupMenu(MainActivity.this,null);
        Menu menu = p.getMenu();
        getMenuInflater().inflate(menuId,menu);
        return menu;
    }

    public GridView getGridView(){
        return mGridView;
    }

    public void show() {
        mGridView.setVisibility(View.VISIBLE);
        mGridView.animate().translationY(0);
    }

    public void hide() {
        mGridView.animate().translationY(mGridView.getHeight());
    }



    private class BottomBarAdapter extends BaseAdapter {

        private LayoutInflater    mInflater;

        public BottomBarAdapter(){
            this.mInflater = LayoutInflater.from(MainActivity.this);
        }

        @Override
        public int getCount() {
            return mMenu.size();
        }

        @Override
        public Object getItem(int i) {
            return mMenu.getItem(i);
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            MenuItem item = (MenuItem) getItem(i);

            if (view==null){
                view = mInflater.inflate(R.layout.your_item_layout,null);
                view.setId(item.getItemId());
            }

            view.setOnClickListener(mOnClickListener);
            view.findViewById(R.id.bottomnav_icon).setBackground(item.getIcon());
            ((TextView) view.findViewById(R.id.bottomnav_label)).setText(item.getTitle());

            return view;
        }
    }

your_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item1_id"
        android:icon="@drawable/ic_item1"
        android:title="@string/title_item1"/>
    <item android:id="@+id/item2_id"
        android:icon="@drawable/ic_item2"
        android:title="@string/title_item2"/>
    ...
</menu>

และรายการเค้าโครงที่กำหนดเอง your_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="16dp">
    <ImageButton android:id="@+id/bottomnav_icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="top|center_horizontal"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="4dp"/>
    <TextView android:id="@+id/bottomnav_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="4dp"
        style="@style/mystyle_label" />
</LinearLayout>

การใช้งานภายใน mainactivity ของคุณ:

BottomBar bottomBar = new BottomBar(R.id.YourGridView,R.menu.your_menu, mOnClickListener);

และ

private View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.item1_id:
                //todo item1
                break;
            case R.id.item2_id:
                //todo item2
                break;
            ...
        }
    }
}

และใน layout_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    ...
    <FrameLayout android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <GridView android:id="@+id/bottomNav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/your_background_color"
        android:verticalSpacing="0dp"
        android:horizontalSpacing="0dp"
        android:numColumns="4"
        android:stretchMode="columnWidth"
        app:layout_anchor="@id/fragment_container"
        app:layout_anchorGravity="bottom"/>
</android.support.design.widget.CoordinatorLayout>

3

มีBottomNavigationViewใหม่อย่างเป็นทางการในเวอร์ชัน 25 ของไลบรารี Design Support

https://developer.android.com/reference/android/support/design/widget/BottomNavigationView.html เพิ่มใน gradle compile 'com.android.support:design:25.0.0'

XML

<android.support.design.widget.BottomNavigationView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:design="http://schema.android.com/apk/res/android.support.design"
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    design:menu="@menu/my_navigation_items" />

1

ไลบรารีนี้BottomNavigationViewExขยาย BottomNavigationView ของ Google คุณสามารถปรับแต่งไลบรารีของ Google ให้มีแถบนำทางด้านล่างในแบบที่คุณต้องการได้อย่างง่ายดาย คุณสามารถปิดใช้งานโหมดการเปลี่ยนเกียร์เปลี่ยนการแสดงไอคอนและข้อความและอื่น ๆ อีกมากมาย ลองดูแน่นอน


0

ฉันได้อ้างถึงโพสต์ Githubนี้และฉันได้ตั้งค่าthree layoutsสำหรับthree fragmentหน้าในแถบแท็บด้านล่าง

FourButtonsActivity.java:

bottomBar.setFragmentItems(getSupportFragmentManager(), R.id.fragmentContainer,
            new BottomBarFragment(LibraryFragment.newInstance(R.layout.library_fragment_layout), R.drawable.ic_update_white_24dp, "Recents"),
            new BottomBarFragment(PhotoEffectFragment.newInstance(R.layout.photo_effect_fragment), R.drawable.ic_local_dining_white_24dp, "Food"),
            new BottomBarFragment(VideoFragment.newInstance(R.layout.video_layout), R.drawable.ic_favorite_white_24dp, "Favorites")

    );

ในการตั้งค่าจำนวนป้าย:

  BottomBarBadge unreadMessages = bottomBar.makeBadgeForTabAt(1, "#E91E63", 4);
  unreadMessages.show();
  unreadMessages.setCount(4);
  unreadMessages.setAnimationDuration(200);
  unreadMessages.setAutoShowAfterUnSelection(true);

LibraryFragment.java:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class LibraryFragment extends Fragment {
    private static final String STARTING_TEXT = "Four Buttons Bottom Navigation";

    public LibraryFragment() {
    }

    public static LibraryFragment newInstance(int resource) {
        Bundle args = new Bundle();
        args.putInt(STARTING_TEXT, resource);

        LibraryFragment sampleFragment = new LibraryFragment();
        sampleFragment.setArguments(args);

        return sampleFragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View view = LayoutInflater.from(getActivity()).inflate(
                getArguments().getInt(STARTING_TEXT), null);
        return view;


    }

0

คุณสามารถสร้างเลย์เอาต์ตามคำตอบที่กล่าวมาหากใครต้องการใช้สิ่งนี้ใน kotlin: -

 private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.images -> {
          // do your work....
            return@OnNavigationItemSelectedListener true
        }
       R.id.videos ->
         {
          // do your work....
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

จากนั้นในการสร้างคุณสามารถตั้งค่าผู้ฟังด้านบนเป็นมุมมองของคุณ

   mDataBinding?.navigation?.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

-1
<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="?android:attr/windowBackground"
    app:menu="@menu/navigation" />

navigation.xml (เมนูด้านใน)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home"
        app:showAsAction="always|withText"
        android:enabled="true"/>

onCreate()วิธีการภายใน

BottomNavigationView navigation = (BottomNavigationView)findViewById(R.id.navigation);
//Dont forgot this line     
BottomNavigationViewHelper.disableShiftMode(navigation);

และสร้างชั้นเรียนดังต่อไปนี้

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                //noinspection RestrictedApi
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.