7

У меня есть проблема наверняка ее небольшая проблема, но для меня это одна из самых больших проблем в истории ...BottomNavigationView между деятельностью

поэтому проблема, что я добавил Bottom Navigation View для моего приложения, но мне нужно Bottom Навигация Просмотр действий между фрагментами, поэтому я добавил этот код в java для всех моих трех действий ...

Проблема, что при выборе второго или третьего в телефоне выделенного пункта «выделить» является «первым», поэтому все вещи верны, но проблема, которая подчеркивает это, относится к первому элементу автоматически, поэтому, пожалуйста, помогите мне, ребята,

Первый код активность:

BottomNavigationView mBottomNavigation; 

    mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator); 

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()){ 
       case R.id.Nav_Second: 
        Intent Second= new Intent(First.this, Second.class); 
        startActivity(Second); 
        break; 
       case R.id.Nav_Third: 
        Intent Third= new Intent(First.this, Third.class); 
        startActivity(Third); 
        break; 
      } 

      return true; 
     } 
    }); 


}} 

Вторая активность:

BottomNavigationView mBottomNavigation;

mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator); 

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()){ 
       case R.id.Nav_First: 
        Intent First= new Intent(Second.this, First.class); 
        startActivity(First); 
        break; 
       case R.id.Nav_Third: 
        Intent Third= new Intent(Second.this, Third.class); 
        startActivity(Third); 
        break; 
      } 

      return true; 
     } 
    }); 

}} 

Третья активность:

BottomNavigationView mBottomNavigation;

mBottomNavigation =(BottomNavigationView) findViewById(R.id.BottomNavigator); 

    mBottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()){ 
       case R.id.Nav_First: 
        Intent First= new Intent(Third.this, First.class); 
        startActivity(First); 
        break; 
       case R.id.Nav_Second: 
        Intent Second= new Intent(Third.this, Second.class); 
        startActivity(Second); 
        break; 
      } 

      return true; 
     } 
    }); 


}} 

XML-одинаковы для 3 видов деятельности:

<android.support.design.widget.BottomNavigationView 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/BottomNavigator" 
 
     android:background="@color/colorPrimaryDark" 
 
     android:layout_alignParentBottom="true" 
 
     app:itemTextColor="@drawable/item_bg" 
 
     app:itemIconTint="@drawable/item_bg" 
 
     app:menu="@menu/navigate_items"> 
 
    </android.support.design.widget.BottomNavigationView>

Решение, которое мне нужно, чтобы выделить пункт, когда я нажимаю автоматически,

I использовали фрагмент, и он работает отлично, но я все еще начинаю использовать фрагмент, поэтому я использую функцию activeit х годов ...

Ожидание любой быстро помогает

+0

Если я что-то не хватает, это хороший сценарий, чтобы использовать фрагменты (и это работает отлично), так почему бы не придерживаться этого? –

+0

потому что фрагмент немного сложнее, чем основные действия ... – 7uthaifah

+0

Как я могу сделать приложение расширенным с AppCompatActivity – 7uthaifah

ответ

10

Вы можете использовать BottomNavigationView с деятельностью, представляющей вкладки. Ключ состоит в том, чтобы повторить компонент вида навигации в каждом действии и иметь код каждого действия, управляющий компонентом навигации: запуск правильной активности при нажатии на навигационные элементы и выбор правильного элемента навигации после начала действия.

Необходимо активировать новые действия (вкладки) с задержкой, чтобы завершить анимацию переключения вкладок до того, как новая активность заменит предыдущую.

Мой подход состоял в том, чтобы все действия, представляющие вкладки, наследовались от одного и того же класса BaseActivity, реализующего общее поведение.

Это код примера BaseActivity:

public abstract class BaseActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener { 

    protected BottomNavigationView navigationView; 

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

     navigationView = (BottomNavigationView) findViewById(R.id.navigation); 
     navigationView.setOnNavigationItemSelectedListener(this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     updateNavigationBarState(); 
    } 

    // Remove inter-activity transition to avoid screen tossing on tapping bottom navigation items 
    @Override 
    public void onPause() { 
     super.onPause(); 
     overridePendingTransition(0, 0); 
    } 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
     navigationView.postDelayed(() -> { 
      int itemId = item.getItemId(); 
      if (itemId == R.id.navigation_home) { 
       startActivity(new Intent(this, HomeActivity.class)); 
      } else if (itemId == R.id.navigation_dashboard) { 
        startActivity(new Intent(this, DashboardActivity.class)); 
      } else if (itemId == R.id.navigation_notifications) { 
        startActivity(new Intent(this, NotificationsActivity.class)); 
      } 
      finish(); 
     }, 300); 
     return true; 
    } 

    private void updateNavigationBarState(){ 
     int actionId = getNavigationMenuItemId(); 
     selectBottomNavigationBarItem(actionId); 
    } 

    void selectBottomNavigationBarItem(int itemId) { 
     Menu menu = navigationView.getMenu(); 
     for (int i = 0, size = menu.size(); i < size; i++) { 
      MenuItem item = menu.getItem(i); 
      boolean shouldBeChecked = item.getItemId() == itemId; 
      if (shouldBeChecked) { 
       item.setChecked(true); 
       break; 
      } 
     } 
    } 

    abstract int getContentViewId(); 

    abstract int getNavigationMenuItemId(); 

} 

Это весь мой пример, основанный на Bottom шаблон навигации активность андроида программы Studio:

https://github.com/ddekanski/BottomNavigationViewBetweenActivities

+0

Я видел, как вы код, как поддерживать состояния фрагментов внутри действий, когда я нажимаю вкладку 1, я прокручиваю вниз, затем нажимаю вкладку 2 и нажимаю tab1, она меня прокручивает вверх? –

+0

Вместо использования overridePendingTransition (0, 0); в onPause(), используйте @ null в теме. См. Полное решение здесь - https://stackoverflow.com/questions/6972295/switching-activities-without-animation/9312957#9312957 – Shubh

1

Для тех, кто все еще ищет для этого , ответ @ javazian о продлении каждой деятельности, по моему мнению, является излишним.

Более сжатое решение состоит в том, чтобы извлечь навигационное меню и вручную проверить соответствующий пункт меню.

Обратите внимание, что в приведенном ниже примере INSERT_INDEX_HERE необходимо заменить индексом пункта меню (например, пункт меню слева от него имеет индекс 0).

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

    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 

    // Ensure correct menu item is selected (where the magic happens) 
    Menu menu = navigation.getMenu(); 
    MenuItem menuItem = menu.getItem(INSERT_INDEX_HERE); 
    menuItem.setChecked(true); 
}