답변:
API 25.3.0부터 탭한 것처럼 setSelectedItemId(int id)
항목을 선택한 것으로 표시 할 수 있는 방법이 도입되었습니다 .
문서에서 :
선택한 메뉴 항목 ID를 설정합니다. 이것은 항목을 탭하는 것과 동일하게 작동합니다.
코드 예 :
BottomNavigationView bottomNavigationView;
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
bottomNavigationView.setOnNavigationItemSelectedListener(myNavigationItemListener);
bottomNavigationView.setSelectedItemId(R.id.my_menu_item_id);
중대한
당신은 반드시 이미 (경우에 당신이 프로그래밍 할) 메뉴에있는 모든 항목을 추가하고 (난 당신이 메서드를 호출 할 때 실행할 리스너에서 코드를하려는 생각) setSelectedItemId를 호출하기 전에 리스너를 설정했습니다. 메뉴 항목을 추가하고 리스너를 설정하기 전에 setSelectedItemId를 호출하면 아무 일도 일어나지 않습니다.
onTabSelected
분명히 아무것도하지 않을 것입니다. 문서 읽기-> 선택한 메뉴 항목 ID를 설정합니다. 이것은 항목을 탭하는 것과 동일하게 작동합니다. 그것은 안드로이드 개발자 출신
프로그래밍 방식으로 BottomNavigationBar 항목을 클릭하려면 다음을 사용해야합니다.
View view = bottomNavigationView.findViewById(R.id.menu_action_item);
view.performClick();
이렇게하면 레이블이있는 모든 항목이 올바르게 정렬됩니다.
SupportLibrary <25.3.0을 여전히 사용하는 사람들을 위해
이것이이 질문에 대한 완전한 대답인지 확실하지 않지만 내 문제는 매우 유사했습니다. back
버튼 누르기 를 처리 하고 사용자를 이전 탭으로 가져와야했습니다. 따라서 내 솔루션이 누군가에게 유용 할 것입니다.
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);
}
}
사용자가 다른 탐색 탭 BottomNavigationView
을 누르면 현재 선택한 항목이 지워지지 않으므로 onNavigationItemSelected
탐색 작업 처리 후이 메서드를 호출해야합니다 .
@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;
}
인스턴스 상태 저장에 관해서는 action id
내비게이션 뷰 와 동일하게 플레이하고 적절한 솔루션을 찾을 수 있다고 생각합니다 .
Menu menu = bottomNavigationView.getMenu();
소위, 메뉴의 복사본을 반환 bottomNavigationView
객체가 영향을받지 않습니다?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
Menu menu = bottomNavigationView.getMenu();
this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}
android:enabled="true"
BottomNavigationMenu 항목에 추가 합니다.
그런 다음 다음 bottomNavigationView.setOnNavigationItemSelectedListener(mListener)
을 수행하여 선택한대로 설정 하고 설정합니다.bottomNavigationView.selectedItemId = R.id.your_menu_id
이것은 향후 업데이트에 추가 될 것입니다. 그러나 그 동안 이것을 달성하기 위해 반사를 사용할 수 있습니다.
BottomNavigationView에서 확장하는 사용자 지정보기를 만들고 일부 필드에 액세스합니다.
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();
}
}
}
그런 다음 xml 레이아웃 파일에서 사용하십시오.
<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"/>
프로그래밍 방식으로 선택을 수행하는 다른 방법을 추가하는 것뿐입니다. 이것은 아마도 처음에 의도 한 것이거나 나중에 추가되었을 수 있습니다.
Menu bottomNavigationMenu = myBottomNavigationMenu.getMenu();
bottomNavigationMenu.performIdentifierAction(selected_menu_item_id, 0);
는 performIdentifierAction
소요 Menu
항목 ID 및 플래그.
자세한 내용은 설명서 를 참조하십시오.
API 25 이상에서는 setSelectedItemId (menu_item_id)를 사용할 수 있지만 API 25에서는 메뉴를 사용하여 핸들을 얻은 다음 setChecked를 Checked 특정 항목으로 설정해야합니다.
코드를 수정하고 싶지 않습니다. 그렇다면 BottomNavigationViewEx 를 사용해 보는 것이 좋습니다 。
당신은 메소드를 호출 setCurrentItem(index);
하고 getCurrentItem()
。
BottomNavigationView에서 페이지를 선택하는 신뢰할 수있는 방법이 없다는 사실에 대해 Google에 버그를 작성했습니다. https://code.google.com/p/android/issues/detail?id=233697
NavigationView에는 분명히 비슷한 문제가 있었는데, 새로운 setCheckedItem () 메서드를 추가하여 수정했습니다.
performClick 메소드를 시도해 볼 수 있습니다.
View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
view.performClick();
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);
}
}
솔루션의 유일한 '마이너스'는을 사용 MenuItemImpl
하는 것인데, 이는 라이브러리에 대해 '내부'(공개이지만)입니다.
단편 인수를 동적으로 전달해야하는 경우이 작업을 수행하십시오.
여기에는 (대부분 반복되거나 오래된) 답변이 많이 있지만 그중 어느 것도 매우 일반적인 요구를 처리하지 않습니다 . 탭에로드 된 Fragment에 다른 인수를 동적으로 전달하는 것 입니다.
를 사용하여로드 된 프래그먼트에 다른 인수를 동적으로 전달할 수 없으며 setSelectedItemId(R.id.second_tab)
이는 결국 static OnNavigationItemSelectedListener
. 이 제한을 극복하기 위해 MainActivity
탭이 포함 된 내에서이 작업을 수행했습니다 .
fun loadArticleTab(articleId: String) {
bottomNavigationView.menu.findItem(R.id.tab_article).isChecked = true // use setChecked() in Java
supportFragmentManager
.beginTransaction()
.replace(R.id.main_fragment_container, ArticleFragment.newInstance(articleId))
.commit()
}
이 ArticleFragment.newInstance()
메서드는 평소와 같이 구현됩니다.
private const val ARG_ARTICLE_ID = "ARG_ARTICLE_ID"
class ArticleFragment : Fragment() {
companion object {
/**
* @return An [ArticleFragment] that shows the article with the given ID.
*/
fun newInstance(articleId: String): ArticleFragment {
val args = Bundle()
args.putString(ARG_ARTICLE_ID, day)
val fragment = ArticleFragment()
fragment.arguments = args
return fragment
}
}
}
이게 도움이 되길 바란다
//Setting default selected menu item and fragment
bottomNavigationView.setSelectedItemId(R.id.action_home);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new HomeFragment()).commit();
이는 해당 하단 탐색 메뉴 항목과 동시에로드되는 기본 조각을 결정하는 것입니다. OnResume 콜백에 동일한 것을 포함 할 수 있습니다.
이 방법은 저에게 효과적입니다.
private fun selectBottomNavigationViewMenuItem(bottomNavigationView : BottomNavigationView,@IdRes menuItemId: Int) {
bottomNavigationView.setOnNavigationItemSelectedListener(null)
bottomNavigationView.selectedItemId = menuItemId
bottomNavigationView.setOnNavigationItemSelectedListener(this)
}
예
override fun onBackPressed() {
replaceFragment(HomeFragment())
selectBottomNavigationViewMenuItem(navView, R.id.navigation_home)
}
private fun replaceFragment(fragment: Fragment) {
val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.frame_container, fragment)
transaction.commit()
}
반사는 나쁜 생각입니다.
이 요점으로 향하십시오 . 선택을 수행하지만 콜백을 호출하는 메소드가 있습니다.
@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;
}
callOnClick()
대신 사용 합니다 performClick()
. 이렇게하면 performClick()
어차피 작동하지 않는 사운드를 비활성화 할 필요가 없습니다 .
BottomNavigationView
내부 상태 저장을 수행하지 않는 것 같습니다. 아마도 이것이 향후 업데이트에 포함될 것으로 예상합니다. 여기에 (일부 추가 정보를 포함) 중복 : stackoverflow.com/questions/40236786/...