Saya menggunakan baru android.dukungan.desain.widget.BottomNavigationView
dari dukungan perpustakaan.
Bagaimana saya dapat mengatur pilihan saat ini dari kode? Saya menyadari, bahwa pemilihan ini diubah kembali ke item pertama, setelah memutar layar. Tentu saja hal ini juga akan membantu, jika seseorang bisa memberitahu saya, bagaimana "simpan" keadaan saat ini BottomNavigationView
di onPause
fungsi dan cara mengembalikannya dalam onResume
.
Terima kasih!!!
Dari API 25.3.0 itu diperkenalkan metode setSelectedItemId(int id)
yang memungkinkan anda menandai item yang dipilih seolah-olah itu disadap.
Dari docs:
Set menu yang dipilih item ID. Ini berperilaku sama seperti menekan pada item.
Contoh kode:
BottomNavigationView bottomNavigationView;
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
bottomNavigationView.setOnNavigationItemSelectedListener(myNavigationItemListener);
bottomNavigationView.setSelectedItemId(R.id.my_menu_item_id);
PENTING
Anda *HARUS *** telah menambahkan semua item menu(jika anda melakukan ini secara terprogram) dan mengatur Pendengar sebelum memanggil setSelectedItemId(saya percaya anda ingin kode anda pendengar untuk menjalankan ketika anda memanggil metode ini). Jika anda menelepon setSelectedItemId sebelum menambahkan item menu dan pengaturan pendengar tidak akan terjadi.
Untuk pemrograman klik pada BottomNavigationBar item anda perlu menggunakan:
View view = bottomNavigationView.findViewById(R.id.menu_action_item);
view.performClick();
Ini mengatur semua barang-barang dengan label mereka dengan benar.
Bagi mereka yang masih menggunakan SupportLibrary < 25.3.0
I'm tidak yakin apakah ini adalah jawaban yang lengkap untuk pertanyaan ini, tetapi masalah saya adalah sangat mirip - aku harus proses kembali
tombol tekan dan membawa pengguna ke tab sebelumnya di mana ia berada. Jadi, mungkin saya solusi ini akan berguna bagi seseorang:
private void updateNavigationBarState(int actionId){
Menu menu = bottomNavigationView.getMenu();
for (int i = 0, size = menu.size(); i < size; i++) {
MenuItem item = menu.getItem(i);
item.setChecked(item.getItemId() == actionId);
}
}
Harap diingat bahwa jika pengguna menekan navigasi lainnya tab BottomNavigationView
tidak't hapus item yang dipilih saat ini, sehingga anda perlu untuk memanggil metode ini dalam onNavigationItemSelected
setelah pengolahan navigasi tindakan:
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.some_id_1:
// process action
break;
case R.id.some_id_2:
// process action
break;
...
default:
return false;
}
updateNavigationBarState(item.getItemId());
return true;
}
Mengenai penghematan contoh negara saya pikir anda bisa bermain dengan sama id action
dari tampilan navigasi dan menemukan solusi yang cocok.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
Menu menu = bottomNavigationView.getMenu();
this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}
Tambahkan android:enabled="benar"
untuk BottomNavigationMenu Item.
Dan kemudian mengatur bottomNavigationView.setOnNavigationItemSelectedListener(mListener)
dan
set yang dipilih dengan melakukan bottomNavigationView.selectedItemId = R. id.your_menu_id
Ini mungkin akan ditambahkan dalam update mendatang. Tapi sementara itu, untuk mencapai hal ini anda dapat menggunakan refleksi.
Membuat tampilan kustom yang membentang dari BottomNavigationView dan akses beberapa bidang.
public class SelectableBottomNavigationView extends BottomNavigationView {
public SelectableBottomNavigationView(Context context) {
super(context);
}
public SelectableBottomNavigationView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SelectableBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setSelected(int index) {
try {
Field f = BottomNavigationView.class.getDeclaredField("mMenuView");
f.setAccessible(true);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) f.get(this);
try {
Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE);
method.setAccessible(true);
method.invoke(menuView, index);
} catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
Dan kemudian menggunakannya dalam xml file layout.
<com.your.app.SelectableBottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:itemBackground="@color/primary"
app:itemIconTint="@drawable/nav_item_color_state"
app:itemTextColor="@drawable/nav_item_color_state"
app:menu="@menu/bottom_navigation_menu"/>
Hanya menambahkan cara lain untuk melakukan seleksi secara programatik - ini mungkin adalah apa niat di tempat pertama atau mungkin ini ditambahkan di kemudian hari.
Menu bottomNavigationMenu = myBottomNavigationMenu.getMenu();
bottomNavigationMenu.performIdentifierAction(selected_menu_item_id, 0);
The performIdentifierAction
mengambil Menu
item id dan bendera.
Lihat dokumentasi untuk info lebih lanjut.
Saya membuat sebuah bug di Google tentang fakta bahwa ada's tidak ada cara yang dapat diandalkan untuk memilih halaman di BottomNavigationView: https://code.google.com/p/android/issues/detail?id=233697
NavigationView rupanya punya masalah yang sama, yang mereka diperbaiki dengan menambahkan baru setCheckedItem() metode.
private void setSelectedItem(int actionId) {
Menu menu = viewBottom.getMenu();
for (int i = 0, size = menu.size(); i < size; i++) {
MenuItem menuItem = menu.getItem(i);
((MenuItemImpl) menuItem).setExclusiveCheckable(false);
menuItem.setChecked(menuItem.getItemId() == actionId);
((MenuItemImpl) menuItem).setExclusiveCheckable(true);
}
}
Satu-satunya 'minus' dari solusi adalah menggunakan MenuItemImpl
, yang 'internal' ke perpustakaan (meskipun publik).
JIKA ANDA PERLU UNTUK SECARA DINAMIS LULUS FRAGMEN ARGUMEN INI
Ada banyak (kebanyakan diulang atau usang) jawaban berikut ini namun tidak satupun dari mereka pegangan yang sangat umum perlu: dinamis lewat argumen yang berbeda ke Fragmen dimuat ke tab.
Anda dapat't dinamis lulus argumen yang berbeda untuk dimuat Fragmen dengan menggunakan setSelectedItemId(R. id.second_tab)
, yang berakhir menelepon statis OnNavigationItemSelectedListener
. Untuk mengatasi keterbatasan ini saya've akhirnya melakukan ini pada saya MainActivity
yang berisi tab:
menyenangkan loadArticleTab(articleId: String) { bottomNavigationView.menu.findItem(R. id.tab_article).isChecked = true // menggunakan setChecked() di Jawa supportFragmentManager .beginTransaction() .mengganti(R. id.main_fragment_container, ArticleFragment.newInstance(articleId)) .commit() }
The ArticleFragment.newInstance()
metode ini dilaksanakan seperti biasa:
`` private const val ARG_ARTICLE_ID = "ARG_ARTICLE_ID"
kelas ArticleFragment : Fragmen() {
pendamping objek { /**
} ``
Refleksi adalah ide yang buruk.
Kepala ini inti. Ada metode yang melakukan pemilihan, tetapi juga memanggil callback:
@CallSuper
public void setSelectedItem(int position) {
if (position >= getMenu().size() || position < 0) return;
View menuItemView = getMenuItemView(position);
if (menuItemView == null) return;
MenuItemImpl itemData = ((MenuView.ItemView) menuItemView).getItemData();
itemData.setChecked(true);
boolean previousHapticFeedbackEnabled = menuItemView.isHapticFeedbackEnabled();
menuItemView.setSoundEffectsEnabled(false);
menuItemView.setHapticFeedbackEnabled(false); //avoid hearing click sounds, disable haptic and restore settings later of that view
menuItemView.performClick();
menuItemView.setHapticFeedbackEnabled(previousHapticFeedbackEnabled);
menuItemView.setSoundEffectsEnabled(true);
mLastSelection = position;
}