Autore Topic: Aggiornare gli Item della ActionBar a seconda della Tab visualizzata  (Letto 347 volte)

Offline Drugsmatt

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Ciao a tutti, avrei bisogno di ottenere la posizione numerica della Tab visualizzata per poter mostrare/nascondere gli Item della ActionBar nella MainActivity. Per esempio, sono nella Tab1, visualizzo l'Item per scrivere un nuovo messaggio, passo alla Tab2, nascondo il precedente e visualizzo l'Item per aggiungere un utente alla rubrica, ecc per le altre Tab...
Struttura dell'app: MainActivity composta da Tab Layout (4 Tabs) con un FragmentStatePagerAdapter che gestisce i vari Fragment.

MainActivity
Codice (Java): [Seleziona]
public class MainActivity extends AppCompatActivity {

    // Declaring Your View and Variables

    Toolbar toolbar;
    ViewPager pager;
    ViewPagerAdapter adapter;
    SlidingTabLayout tabs;
    CharSequence Titles[]={"1","2","3","4"};
    int Numboftabs =4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //getSupportActionBar().setElevation(0);
        setContentView(R.layout.activity_main);

        //
        // Creating The Toolbar and setting it as the Toolbar for the activity

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        //setSupportActionBar(toolbar);

        // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
        adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);

        // Assigning ViewPager View and setting the adapter
        pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);

        // Assiging the Sliding Tab Layout View
        tabs = (SlidingTabLayout) findViewById(R.id.tabs);
        tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

        // Setting Custom Color for the Scroll bar indicator of the Tab View
        tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
            @Override
            public int getIndicatorColor(int position) {
                return ContextCompat.getColor(getApplicationContext(), R.color.darkgreen);
            }
        });

        // Setting the ViewPager For the SlidingTabsLayout
        tabs.setViewPager(pager);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        switch (id) {
            case R.id.action_settings:
                Intent intentMSett = new Intent(this, MainSettings.class);
                startActivity(intentMSett);
                break;
            case R.id.action_add_user:
                Intent intent = new Intent(this, CreateUser.class);
                startActivityForResult(intent, 101);
                break;
            case R.id.action_search:
                Toast.makeText(getApplicationContext(),
                        "search", Toast.LENGTH_SHORT).show();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

}

ViewPagerAdapter

Codice (Java): [Seleziona]
public class ViewPagerAdapter extends FragmentStatePagerAdapter {

    CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
    int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
    private Context context;

    // Build a Constructor and assign the passed Values to appropriate values in the class
    public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb) {
        super(fm);

        this.Titles = mTitles;
        this.NumbOfTabs = mNumbOfTabsumb;

    }

    //This method return the fragment for the every position in the View Pager
    @Override
    public Fragment getItem(int position) {

        if(position == 0) // if the position is 0 we are returning the First tab
        {
            Tab1 tab1 = new Tab1();
            return tab1;
        } else if(position == 1){
            Tab2 tab2 = new Tab2();
            return tab2;
        } else if(position == 2) {
            Tab3 tab3 = new Tab3();
            return tab3;
        } else if(position == 3) {
            Tab4 tab4 = new Tab4();
            return tab4;
        } else {
            Tab1 tab1 = new Tab1();
            return tab1;
        }
    }

    // This method return the titles for the Tabs in the Tab Strip

    @Override
    public CharSequence getPageTitle(int position) {

        return Titles[position];
    }

    // This method return the Number of tabs for the tabs Strip

    @Override
    public int getCount() {
        return NumbOfTabs;
    }
}

Cercando delle soluzioni ho trovato ad esempio questo metodo da inserire nella MainActivity

Codice (Java): [Seleziona]
@Override
 public boolean onPrepareOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        MenuInflater inflater = getMenuInflater();
        int currentTab = tabHost.getCurrentTab();
        Toast.makeText(getApplicationContext(), currentTab+"", Toast.LENGTH_SHORT);
        menu.clear();
        if (currentTab == 0) {
            inflater.inflate(R.menu.first, menu);  //  menu for photospec.
        } else {
            inflater.inflate(R.menu.second, menu);  // menu for songspec
        }
        return super.onPrepareOptionsMenu(menu);
    }

Ma non saprei come implementare getCurrentTab() per ottenere la posizione della Tab, mentre nel ViewPagerAdapter posso controllare la posizione ma non so come passargli il Menu dalla MainActivity.

Qualche idea? Grazie in anticipo!

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Aggiornare gli Item della ActionBar a seconda della Tab visualizzata
« Risposta #1 il: 15 Novembre 2015, 18:23:25 CET »
0
Ciao , per sapere quale pagina stai visualizzando ti basta settare quanto segue
Codice (Java): [Seleziona]
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       if(position == 1){  //POSIZIONE CORRENTE = A PAGINA 2
       }
       if(position == 0){  //POSIZIONE CORRENTE = A PAGINA 1
       }
       // eccc......
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

Offline Drugsmatt

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:Aggiornare gli Item della ActionBar a seconda della Tab visualizzata
« Risposta #2 il: 16 Novembre 2015, 09:39:53 CET »
0
L'ho inserito nella MainActivity ma ho un errore cannot resolve symbol 'addOnPageChangeListener', ho guardato la mia versione della support library v4 ed è aggiornata (com.android.support:support-v4:23.1.0)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:Aggiornare gli Item della ActionBar a seconda della Tab visualizzata
« Risposta #3 il: 16 Novembre 2015, 09:52:05 CET »
+1
Invece che addOnPage.... metti setOnPage ... o comunque non fare copia e incolla ma metti nome variabile fai il . E vedrai che ti esce il metodo corretto ...  ;-)

Offline Drugsmatt

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:Aggiornare gli Item della ActionBar a seconda della Tab visualizzata
« Risposta #4 il: 16 Novembre 2015, 11:29:14 CET »
0
Invece che addOnPage.... metti setOnPage ... o comunque non fare copia e incolla ma metti nome variabile fai il . E vedrai che ti esce il metodo corretto ...  ;-)

Ok, ho creato un metodo pubblico getCurrentTab e ho inserito dentro la tua porzione di codice, abbinato a una variabile pubblica e al metodo onPrepareOptionsMenu con il quale aggiorno la visibilità degli Item nel Menu tutto funziona!

Posto il codice:

Codice (Java): [Seleziona]
Integer tabSelected = 1; // Impostare la posizione di default per evitare errore null pointer exception

// Metodo per ritornare la Tab selezionata
    public Integer getCurrentTab(){
        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        tabSelected = 1;
                        break;
                    case 1:
                        tabSelected = 2;
                        break;
                    case 2:
                        tabSelected = 3;
                        break;
                    case 3:
                        tabSelected = 4;
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        return tabSelected;
    }

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // cambia l'item alla action bar a seconda della Tab selezionata
        MenuInflater inflater = getMenuInflater();
        tabSelected = getCurrentTab();

        switch (tabSelected) {
            case 1:
                //attività Tab 1
                break;
            case 2:
               //attività Tab 2
                break;
            case 3:
                MenuItem addUser = menu.findItem(R.id.action_add_user);
                addUser.setVisible(true);
                break;
            case 4:
                MenuItem message = menu.findItem(R.id.action_message);
                message.setVisible(true);
                break;
        }
        return super.onPrepareOptionsMenu(menu);
    }

Segnalo anche un altro metodo funzionante nel mio caso (non comodo come quello suggerito da pietroconti89), ad ogni Fragment (Tab1, Tab2, Tab3, Tab4) va implementato OnCreateOptionMenu, come su una normale Activity e va caricato un menù specifico contenente gli Item che occorrono per quella Tab, i quali andranno ad aggiungersi a quelli già caricati in MainActivity.
Esempio:
Codice (Java): [Seleziona]
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  super.onCreateOptionsMenu(menu, inflater);
  inflater.inflate(R.menu.your_fragment_menu, menu);
}