FernandoPaiva
FernandoPaiva

Reputation: 4460

Displaying an item of actionbar when a Fragment is visible true?

In my app I have a chat and this chat is a Fragment(ChatFrag). I open this fragment from an item in my actionbar. This item is setted visible false and it will visible true when the BattleRoomFrag(fragment) is visible because ChatFrag only works in this room (BattleRoomFrag).

How can I do it ?

To do it I'm trying this.

custom_drawer_layout

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="br.com.williarts.batalhajuridica.CustomDrawerLayout" >

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never"/>


<!--Chat Button Item -->
<item
    android:id="@+id/action_chat"
    android:icon="@drawable/batalha_icon_chat"
    android:title="Chat"
    app:showAsAction="always"
    android:visible="false"

    />

ActionBarActivity

public class CustomDrawerLayout extends ActionBarActivity implements OnItemClickListener{
    private ActionBar ab;
    private DrawerLayout dl;
    private ListView lv;
    private ActionBarDrawerToggle tg;

    private List<ItensListView> fragments;
    private CharSequence tl; //titulo principal
    private CharSequence tlf; //titulo fragment 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_drawerlayout);
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.action_bar)));
        init();

        if(savedInstanceState == null){
            selectedItem(0);
        }       
    }

    private void init(){
        //actionbar
        onConfigActionBar();
        //listview
        configItensListView();
        lv = (ListView)findViewById(R.id.lv);               
        lv.setAdapter(new DrawerLayoutListViewAdapter(this, fragments));
        lv.setOnItemClickListener(this);        
        //drawerlayout
        dl = (DrawerLayout)findViewById(R.id.dl);
        //actionbardrawertoggle
        tg = new ActionBarDrawerToggle(this, dl, R.drawable.btmenu, R.string.nomeActionBar){
            public void onDrawerClosed(View view) {
                ab.setTitle(tl);                
                supportInvalidateOptionsMenu();
            }

            public void onDrawerOpened(View view) {
                ab.setTitle(tlf);
                supportInvalidateOptionsMenu();
            }
        };      
        dl.setDrawerListener(tg);

        tl = tlf = getTitle();      
    }

    /** ativa actionbar e botao home na action bar */
    private void onConfigActionBar(){
        ab = getSupportActionBar();
        ab.setDisplayHomeAsUpEnabled(true);
        ab.setHomeButtonEnabled(true);
    }




    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        tg.onConfigurationChanged(newConfig);
    }

    /** necessario */
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        tg.syncState();
    }

    /** necessario */
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         FragmentTransaction ft;
         Fragment frag;

         if(item.getItemId() == R.id.action_chat){
             frag = new ChatFrag();
             ft = getSupportFragmentManager().beginTransaction();
             ft.replace(R.id.fl, frag, "ChatFrag");
             ft.addToBackStack("back");
             ft.commit();
         }

         if (tg.onOptionsItemSelected(item)) {
                return true;
         }
         return super.onOptionsItemSelected(item);
     }


     /** necessario */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.custom_drawer_layout, menu);

        return true;
    }

    /** necessario */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        boolean status = dl.isDrawerOpen(lv);
        menu.findItem(R.id.action_settings).setVisible(!status);

        BattleRoomFrag brf = (BattleRoomFrag)getSupportFragmentManager().findFragmentByTag("BattleRoomFrag");
        MenuItem m = menu.getItem(R.id.action_chat);
        if(brf != null && brf.isVisible()){
            m.setVisible(true);
        }else{
            m.setVisible(false);
        }

        return super.onPrepareOptionsMenu(menu);
    }

Upvotes: 0

Views: 169

Answers (1)

usil
usil

Reputation: 643

Try this: In fragment constructor you can set setHasOptionsMenu(true); in onCreateOptionsMenus inflate fragment menu inflater.inflate(R.menu.chat_frag, menu); (Create custom menu for your chat_frag)

Upvotes: 2

Related Questions