webentwicklung-frage-antwort-db.com.de

Legen Sie den ursprünglich ausgewählten Elementindex/die ID in BottomNavigationView fest

Ich habe das neue BottomNavigationView (com.Android.support:design:25.0.0) implementiert und habe keine Ahnung, wie man den Auswahlindex oder die MenuItem-ID setzt (in meinem Fall sollte das mittlere Element standardmäßig ausgewählt werden). Ich fürchte, es gibt noch keine solche Möglichkeit, soweit es noch zu roh ist, aber trotzdem wird jede Hilfe geschätzt. Vielen Dank!

24
UneXp

Stellen Sie die ausgewählte Menüelement-ID mit setSelectedItemId ein:

bottomNavigationView.setSelectedItemId(R.id.item_id);

Diese Methode ist ab Android Support Library 25.3.0 verfügbar.

25
user5968678

Die einzige Lösung, die für mich funktioniert hat, ist:

View view = bottomNavigationView.findViewById(R.id.menu_action_dashboard);
view.performClick();

Einfach nur einen Klick ausführen macht den Trick. Ich hoffe, wir werden in zukünftigen Versionen zusätzliche Methoden/Eigenschaften haben.

UPD:

Als user5968678erwähnt wurde seit Android Support Library v25.3.0 eine neue Methode hinzugefügt:

bottomNavigationView.setSelectedItemId(R.id.item_id);

also stattdessen verwenden :)

46
UneXp

Ich denke, diese Lösung kann etwas eleganter sein als die akzeptierte Antwort:

bottomNavigationView.getMenu().getItem(menuItemIndex).setChecked(true)

dabei ist menuItemIndex der Index des ausgewählten Elements.

15
Jan Slominski

Hier ist, was die Dokumentation darüber sagt:

Menüpunkte können auch verwendet werden, um programmgesteuert auszuwählen, welches Ziel gerade aktiv ist. Es kann mit MenuItem#setChecked(true) gemacht werden

Als Alternative zu dem, was Jan gepostet hat, können Sie den Artikel auch nach ID finden:

Menu menu = findViewById(R.id.navigation).getMenu();
menu.findItem(R.id.navigation_home).setChecked(true);

Ich kann auch den Aufruf von .callOnClick() ANSTELLE VON .performClick() empfehlen.

5
arekolek

Ich glaube, die Frage in diesem Zusammenhang wird in verschiedenen Zusammenhängen betrachtet, basierend auf den Antworten hier. Nach Einschätzung ist die Fähigkeit erforderlich, sich auf ein bestimmtes BottomNavigationView Objekt zu konzentrieren (definitiv in einer neuen Klasse, die verschiedene Fragmente enthält).

Jetzt können Sie BottomNavigationView OR= Buttons oder Anything clickable haben, um absichtlich eine neue Aktivität zu starten: - d. H.

Intent intent = new Intent(getActivity(), New_Activity.class);
    intent.putExtra("EXTRA_PAGE, 1);
    startActivityForResult(intent, 30);

Dann -in unserer New_Activity erhalten wir die Absicht-

Intent intent = getIntent (); int page = intent.getExtras (). getInt ("EXTRA_PAGE);

Wir durchlaufen dann die Seitenvariable, um die Nummer/den Index zu finden, für den die aktuelle BottomNavigationView reflektiert, THEN Wir setzen unseren Fokus-Menüpunkt (vorausgesetzt, Ihr BottomNavigationView hat einen Menüpunkt zur Anzeige)

     if(page == 1) {
         currentselect = new Pending();
            bottomNavigationView.getMenu().getItem(0).setChecked(true);
}

Dies beantwortet die Frage oben. Der Rest des Fragment-Schalters wird von der Anzahl der oben genannten Posts durch Aufrufen von gut gehandhabt:

bottomNavigationView.setOnNavigationItemSelectedListener(navListener);

Dann so etwas wie:

   private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener(){
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFrag = null;
                switch (item.getItemId()) {
                    case R.id.pending:
                        selectedFrag = new Pending();
                        break;
                    case R.id.onTransmit:
                        selectedFrag = new inTransmit();
                        break;
                    case R.id.complete:
                        selectedFrag = new Complete();
                        break;
                }

                getSupportFragmentManager().beginTransaction().replace(R.id.select_field, selectedFrag).commit();

                return true;
            }
        };

HINWEIS: Die Verwendung von BottomNavigationView und ContentFrameLayout ist so sparsam und reduziert Ihren Code auf über 50%, im Gegensatz zur Verwendung von ViewPager und Tablayout

3
Mbanda

Wenn Sie Listener verwenden, wie bei der Standardimplementierung in Android Studio, versuchen Sie Folgendes:

BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
Integer indexItem = 4;
navigation.getMenu().getItem(indexItem).setChecked(true);
mOnNavigationItemSelectedListener.onNavigationItemSelected(navigation.getMenu().getItem(indexItem));
2
gugapc

Mit Reflection aufhören! Es ist schlecht! 

Die Support-Bibliothek gibt uns zwar nicht die Möglichkeit, das Element aus der BottomNavigationView auszuwählen, das beim ersten Anzeigen angezeigt wird, wenn es sichtbar ist, wir haben jedoch zwei Möglichkeiten:

Zuerst mit der Schleife:

private void setupBottomNavigationView() {
    // Get the menu from our navigationBottomView.
    Menu bottomNavigationViewMenu = bottomNavigationView.getMenu();
    // Uncheck the first menu item (the default item which is always checked by the support library is at position 0).
    bottomNavigationMenu.findItem(R.id.action_one).setChecked(false);
    // Check the wished first menu item to be shown to the user.
    bottomNavigationMenu.findItem(R.id.action_two).setChecked(true);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    Menu bottomNavigationMenu = bottomNavigationView.getMenu();
            for (int i = 0; i < bottomNavigationMenu.size(); i++) {
                if (item.getItemId() != bottomNavigationMenu.getItem(i).getItemId()) {
                    bottomNavigationMenu.getItem(i).setChecked(false);
                }
            }

            switch (item.getItemId()) {
                case R.id.action_one :
                    replaceFragment(new OneFragment());
                    break;
                case R.id.action_two :
                    replaceFragment(new TwoFragment());
                    break;
                case R.id.action_three :
                    replaceFragment(new ThreeFragment());
                    break;
            }
            return false;
        }
    });
}

Zweitens ohne Schleife, aber mit einer Klassenvariablen (weil die Logik innerhalb der inneren Klasse ausgeführt wird):

private void setupBottomNavigationView() {
    // Get the menu from our navigationBottomView.
    Menu bottomNavigationViewMenu = bottomNavigationView.getMenu();
    // Uncheck the first menu item (the default item which is always checked by the support library is at position 0).
    bottomNavigationViewMenu.findItem(R.id.action_one).setChecked(false);
    // Check the wished first menu item to be shown to the user. Also store that menu item on a variable to control when a menu item must be unchecked.
    mActiveBottomNavigationViewMenuItem = bottomNavigationViewMenu.findItem(R.id.action_two).setChecked(true);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem selectedMenuItem) {
            switch (selectedMenuItem.getItemId()) {
                case R.id.action_one :
                    replaceFragment(new OneFragment());
                    break;
                case R.id.action_two :
                    replaceFragment(new TwoFragment());
                    break;
                case R.id.action_three :
                    replaceFragment(new ThreeFragment());
                    break;
            }

            if (selectedMenuItem != mActiveBottomNavigationViewMenuItem){
                mActiveBottomNavigationViewMenuItem.setChecked(false);
                mActiveBottomNavigationViewMenuItem = selectedMenuItem;
            }

            return false;
        }
    });
}

private MenuItem mActiveBottomNavigationViewMenuItem;

Wenn die setupBottomNavigationView () - Methode ausgeführt wird? Schauen Sie sich die Activity onCreate () -Methode an:

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

Einfach und ohne umfangreichen Code.

Ich hoffe es hilft!

Kotlin-Code für das erste ausgewählte Element in bottomnavigation.BottomNavigationView:

bottom_navigation_view.selectedItemId = R.id.navigation_item_messages
0
Hamed Jaliliani

Sie können BottomNavigationView erweitern und Reflection verwenden, um private Methoden aufzurufen.

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 {
            BottomNavigationMenuView menuView = (BottomNavigationMenuView) getField(BottomNavigationView.class, "mMenuView");
            OnNavigationItemSelectedListener listener = (OnNavigationItemSelectedListener) getField(BottomNavigationView.class, "mListener");
            try {
                Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE);
                method.setAccessible(true);
                // activate item.
                method.invoke(menuView, index);
                if (listener != null) {
                    // trigger item select event.
                    listener.onNavigationItemSelected(getMenu().getItem(index));
                }
            } catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    private Object getField(Class clazz, String fieldName) throws NoSuchFieldException, IllegalAccessException {
        Field f = clazz.getDeclaredField(fieldName);
        f.setAccessible(true);
        return f.get(this);
    }

}
0
cpienovi

Implementiere BottomNavigationView.OnNavigationItemSelectedListener und stelle selectedItemId bei der Initialisierung ein.

this.bottomNavigationView.setOnNavigationItemSelectedListener {
    val targetFragment = when (menuItem.itemId) {
        R.id.action_home -> {
            HomeFragment()
        }
        R.id.action_post -> {
            PostFragment()
        }
        R.id.action_settings -> {
            SettingsFragment()
        }
        else -> null
    }
    targetFragment?.let {
        this.activity?.supportFragmentManager?.transaction {
            replace(R.id.containerLayout, it, it.javaClass.simpleName)
        }
    }
    true
}

this.bottomNavigationView.selectedItemId = R.id.action_home
0
Morgan Koh