3

我不断收到 NullPointerException 试图从我的 UI 中放气或使 ViewStub 不可见。我只是想确定我做得对。

我通过执行以下操作在 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()中,我根据菜单项选择来写这两种情况。第一种情况,托盘不可见,所以我让它可见。案例 2 可见时,因此我通过执行以下操作将其隐藏:

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

}

我知道我在某个地方犯了一个愚蠢的错误。而我现在的头脑太饱和了,无法直接思考。需要帮忙 :(

谢谢,

抗体

4

2 回答 2

5

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

您可以为 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;
}
于 2012-10-09T12:04:44.140 回答
1

Abhishek,您似乎正在尝试实现某种抽屉功能。如果您简单地使用SlidingDrawer类,您可能能够绕过所有这些设置视图可见性的混乱。

于 2011-11-04T16:45:52.490 回答