0
votes

Y a-t-il un équivalent pour DoitelectViewController dans Android pour BottomNavigationView?

J'ai une vue de fond de novation dans mon activité Android, composée de 4 menuitem. Lorsque j'utilise sur le menu Téléchargements, je vérifie s'il y a des contenus téléchargés disponibles, si disponible, je permettrais à la navigation de se produire et s'il n'y a pas de contenu téléchargé, je montrerai un toast indiquant la même chose et je souhaite que l'onglet précédent reste sélectionné. . Dans iOS, je peux utiliser la méthode des délégués DevraityectViewController pour déterminer si la navigation peut être autorisée ou non. La signature de méthode est spécifiée ci-dessous:

    private void BottomNavigationItemSelected(object obj, BottomNavigationView.NavigationItemSelectedEventArgs args)
    {
        Android.Support.V4.App.Fragment fragment = null;
        Android.Support.V4.App.Fragment currentFragment = SupportFragmentManager.FindFragmentById(Resource.Id.content_frame);
        string title = "";
        if (args.Item.ItemId == Resource.Id.menu_explore)
        {
            _selectedToolbarId = args.Item.ItemId;
            title = Resources.GetString(Resource.String.shelf_title);
            fragment = _exploreFragment;
            _fragmentTag = "Home";
        }
        else
        {
            title = args.Item.TitleFormatted.ToString();
        }
        if (args.Item.ItemId == Resource.Id.menu_dashboard)
        {
            //COULD BE MADE CONFIGURABLE
            //fragment = _dashboardFragment;
            _selectedToolbarId = args.Item.ItemId;
            fragment = _redesignDashboard;
            _fragmentTag = "Dashboard";
        }
        else if (args.Item.ItemId == Resource.Id.menu_more)
        {
            _selectedToolbarId = args.Item.ItemId;
            fragment = _moreFragment;
            _fragmentTag = "More";
        }
        else if (args.Item.ItemId == Resource.Id.menu_report)
        {
            _selectedToolbarId = args.Item.ItemId;
            fragment = _reportFragment;
            _fragmentTag = "Report";
        }
        else if (args.Item.ItemId == Resource.Id.menu_downloads)
        {
            List<Product> _downloadProducts = DBService.GetDB().GetDownloadedProducts();
            if (_downloadProducts == null || _downloadProducts.Count == 0)
            {
                _bottomNavigationView.SelectedItemId = _selectedToolbarId;
                Toast.MakeText(this, "No downloaded products", ToastLength.Short).Show();
                args.Item.SetChecked(false);
            }
            else
            {
                _downloadGalleryFragment = new DownloadGalleryFragment(_downloadProducts);
                fragment = _downloadGalleryFragment;
                _fragmentTag = "Downloads";
            }
        }
        if (fragment != null)
        {
            _toolbarTitle.Text = title;
            ToggleTitle(true);
            SupportFragmentManager.BeginTransaction().SetCustomAnimations(Resource.Animation.fab_slide_in_from_right, Resource.Animation.fab_slide_out_to_left).Replace(Resource.Id.content_frame, fragment, _fragmentTag).Commit();
        }
    }

<?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/menu_explore"
      android:enabled="true"
      android:title="@string/explore"
      android:icon="@drawable/explore_icon"
      app:showAsAction="always" />

    <item
      android:id="@+id/menu_dashboard"
      android:enabled="true"
      android:title="@string/dashboard"
      android:icon="@drawable/Dashboard_new_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_report"
      android:enabled="true"
      android:title="@string/reports"
      android:icon="@drawable/dashboard_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_downloads"
      android:enabled="true"
      android:title="@string/menu_downloads"
      android:icon="@drawable/download_icon"
      app:showAsAction="always" />

     <item
      android:id="@+id/menu_more"
      android:enabled="true"
      android:title="@string/more_bottombar"
      android:icon="@drawable/more_icon"
      app:showAsAction="always" />
</menu> 


4 commentaires

Qu'est-ce que vous essayez exactement d'atteindre ici? Voulez-vous que certaines conditions soient remplies avant de passer entre les onglets?


@ G.hakim oui. Oui, seulement si une condition est satisfaite, je souhaite que le commutateur à cet onglet spécifique se produise, sinon l'onglet déjà sélectionné doit rester sélectionné.


Utilisez-vous-tu avec un visionneur de vie?


@ G.hakim en utilisant la novice de novigation avec un cadre dans l'activité.


3 Réponses :


0
votes

Il n'y a pas de tel délégué qui fonctionne comme dilugerViewController code> mais ce que vous pouvez faire est d'obtenir les éléments de menu de la barre de navigation inférieure et désactive ces éléments de menu:

Quelque chose comme ça: p >

var listMenuItems = new List<IMenuItem>();
for (int i = 0; i < bottomNav.Menu.Size(); i++)
{
   listMenuItems.Add(bottomNav.Menu.GetItem(i));
}


7 commentaires

Le problème est que la prise de décision est dynamique et nous voulons toujours que l'élément de menu soit là. Chaque fois que nous cliquons sur l'élément, vérifiez les critères pour afficher le fragment correspondant. Si les critères ne sont pas remplis, réinitialisez le SELECTEMNITEM de BottomNavigationView. Mais le problème est nécessaire, le fragment est chargé, mais la couleur sélectionnée rouge reste toujours avec l'utilisateur tapa au lieu d'être sur celui que j'ai resélectionné par programme.


À partir de l'API 25.3.0, ils ont introduit la méthode setSelecteditemid (int ID) qui permet de marquer un élément comme sélectionné comme s'il était exploité.


Mec c'est ce que j'ai déjà mentionné dans le code. Je resélète l'onglet requis à l'aide de SELECTELITEMID et, par conséquent, l'onglet requis est sélectionné, mais l'icône des onglets de correspondance n'a pas été sélectionnée. _bottomnavigationview.selecteditemid = _selectedToolBarid;


Avez-vous vérifié s'il a le bon identifiant d'article ou non? J'ai le sentiment que ça ne le fait pas!


Oui, j'ai vérifié sa bonne pièce d'identité, de plus, si c'était faux, le fragment dans le cadre aurait changé.


Pouvez-vous ajouter le fichier XML des articles que vous avez utilisé dans votre BottonNavigationView


Ajouté le menu XML



0
votes

On dirait que ceci est un problème avec Android ou la vue de navigation inférieure. Lorsque j'ai exécuté la résélection du fragment précédent après un petit retard de 50 millisecondes, sa fonctionnement bien. C'est-à-dire que le fragment de resélection ou l'icône de fragments précédents est mis en surbrillance selon les besoins.

if (args.Item.ItemId == Resource.Id.menu_downloads)
            {
                List<Product> _downloadProducts = DBService.GetDB().GetDownloadedProducts();
                if (_downloadProducts == null || _downloadProducts.Count == 0)
                {

                   _readProgressTimerTask = new Timer
                    {
                        Enabled = true,
                        Interval = 50,
                        AutoReset = false
                    };
                    _readProgressTimerTask.Elapsed += OnProgressCheckTimeElapsed;
                    Toast.MakeText(this, this.Resources.GetString(Resource.String.no_downloads), ToastLength.Short).Show();
                }
                else
                {
                    _downloadGalleryFragment = new DownloadGalleryFragment(_downloadProducts);
                    fragment = _downloadGalleryFragment;
                    _fragmentTag = "Downloads";
                }
            }

private void OnProgressCheckTimeElapsed(System.Object source, ElapsedEventArgs args)
        {
            this.RunOnUiThread(() =>
            {
                _bottomNavigationView.SelectedItemId = _selectedToolbarId;
            });
        }


0 commentaires

0
votes

Je vous recommande de lire la ligne directrice disponible ici à mettre en œuvre Navigation inférieure pour Android .

Que ce que vous voulez n'a pas beaucoup de sens, un écran vide doit être affiché en disant quelque chose comme "Il n'y a pas de contenu disponible" ou le message que vous aimez.

dans ce lien BottomNavigationView Vous pouvez trouver Toutes les méthodes publiques et les auditeurs que vous pouvez définir sur la navigation inférieure. Quant à votre cas, vous pourriez être intéressé par l'ajout de ces deux.

setonnAnavigageTemreselectedlistener ()

setonnAnVIGITEMSELISELISTENER ()

Cordialement, Pedro.


0 commentaires