how to deflate/hide(invisible) ViewStub from Menu (onOptionsItemSelected)?

5.7k views Asked by At

I keep getting NullPointerException trying to deflate or make invisible the ViewStub from my UI. I just wanted to be sure I am doing it right.

I am inflating my ViewStub in onItemLongClick method of GalleryView by doing the following:

@Override
            public boolean onItemLongClick(AdapterView<?> arg0, View viu, int arg2,
                    long arg3) {
                Toast.makeText(GalleryView.this, "New item added to Favorites", Toast.LENGTH_SHORT).show();


                favsCount++;

               //checking to see if ViewStub is already inflated or not
                if(!stubvis){
                stub = (ViewStub) findViewById(R.id.stub1);
                stub.inflate();
                stubvis = true;
                trayUP = true;
                }

                return true;
            }

            });

and then in onPrepareOptionsMenu() I am adding the menu item based on the visibility of ViewStub. If inflated and visible, I create a menu item to hide it, otherwise, a menu item to show/make visible.

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

menu.clear();


if(trayUP) {

menu.add(0, HIDETRAY, 0, "Hide Favorites Tray");

} else {

menu.add(0, SHOWTRAY, 0, "Show Favorites Tray");

}

return super.onPrepareOptionsMenu(menu);

}

Next, in onOptionsItemSelected(), I am writing the two cases based on the menu item selection. Case 1 when the tray is not visible, so I make it visible. Case 2 when it is visible, so I hide it by doing the following:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case HIDETRAY:

            Log.v(TAG, "Hiding Favs Tray");
            findViewById(R.id.stub1).setVisibility(View.GONE);
            trayUP = false;

        case SHOWTRAY:

            Log.v(TAG, "Showing Favs Tray");
            findViewById(R.id.stub1).setVisibility(View.VISIBLE);
            trayUP = true;

        }

    return true;

}

I know I am making a silly mistake somewhere. And my mind is too saturated to think straight at the moment. Need help :(

Thanks,

Ab

2

There are 2 answers

4
Kurtis Nusbaum On BEST ANSWER

Abhishek, it looks like you're trying to implement some sort of drawer functionality. You might be able to get around all of this mess of setting views visibilities if you simply use the SlidingDrawer class instead.

0
Martin Belcher - AtWrk On

Once a view stub has been inflated it will no longer exist in the view hierarchy, it will have been replaced with the inflated contents. So you can only inflate view stubs, there is no way to "deflate" them or change their visibility.

You could define an inflated ID for the ViewStub which you can use to refer to the inflated contents, then use .setVisibility(GONE) or .setVisibility(VISIBLE) to switch that view on and off afterwards.

Example Layout

    <ViewStub
        android:id="@+id/stub_vTray"
        android:inflatedId="@+id/vTray"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/custom_tray_stub" />

Example Java

private Boolean mblnTrayInflated = false;
private Boolean mblnTrayVisible = false;

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case HIDETRAY:

        if (mblnTrayInflated && mblnTrayVisible)
        {
            findViewById(R.id.vTray).setVisibility(View.GONE);
            mblnTrayVisible = false;
        }

        case SHOWTRAY:

        if (!mblnTrayInflated)
        {
            ((ViewStub)findViewById(R.id.stub_vTray)).inflate();
            mblnTrayInflated = true;
            mblnTrayVisible = true;
        }
        else if (!mblnTrayVisible)
        {
            findViewById(R.id.vTray).setVisibility(View.VISIBLE);
            mblnTrayVisible = true;
        }

    }
    return true;
}