如何在菜单(onOptionsItemSelected)中缩小/隐藏(不可见)ViewStub?

3

我一直在尝试缩小或使我的UI中的ViewStub不可见,但是却一直出现NullPointerException。我只是想确保我做得对。

我正在通过以下方式在GalleryView的onItemLongClick方法中填充我的ViewStub:

@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;
            }

            });

然后在onPrepareOptionsMenu()中,我根据ViewStub的可见性添加菜单项。如果已经填充并可见,则创建一个菜单项来隐藏它,否则创建一个菜单项来显示/使其可见。

@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);

}

接下来,在onOptionsItemSelected()方法中,我根据菜单项的选择编写了两种情况。第一种情况是托盘不可见,所以我让它可见。第二种情况是托盘可见,所以我通过以下方式隐藏它:

@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;

我知道我在某个地方犯了一个愚蠢的错误。而且我现在头脑过于饱和,无法清晰地思考。需要帮助 :(

谢谢,

Ab


你遇到了什么异常?能否发布完整的logcat堆栈跟踪信息? - Kurtis Nusbaum
堆栈跟踪?NPE发生在哪里? - JimmyB
在onOptionsItemSelected方法中,View.GONE和View.VISIBLE语句都会导致NPE错误。 - Abhishek Sharma
2个回答

6

一旦视图存根被填充,它将不再存在于视图层次结构中,它将被填充的内容所替代。因此,你只能填充视图存根,没有办法“缩小”它们或改变它们的可见性。

你可以为ViewStub定义一个填充后的ID,用于引用填充的内容,然后使用.setVisibility(GONE)或.setVisibility(VISIBLE)来切换该视图的开关。

示例布局

    <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" />

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;
}

0

Abhishek,看起来你在尝试实现一些抽屉功能。如果你使用SlidingDrawer类,可能就可以避免所有设置视图可见性的烦恼了。


我正在使用ViewStub中的GalleryView。不确定SlidingDrawer如何工作。 - Abhishek Sharma
我打算尝试一下SlidingDrawer...但如果ViewStub也能工作的话,那就太酷了。谢谢Kurtis! - Abhishek Sharma
SlidingDrawer 对于我想要做的事情来说太复杂了 :(。你能帮我找到解决上述 ViewStub 问题的方法吗? - Abhishek Sharma
@AbhishekSharma 我不太确定ViewStub的问题出在哪里。我只是认为抽屉可能是一个好的起点。你到底觉得什么地方复杂?记住,在stackoverflow上你可以提出有关SlidingDrawer的新问题 :) - Kurtis Nusbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接