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() では、メニュー項目の選択に基づいて 2 つのケースを記述しています。トレイが見えないケース1なので、見えるようにします。ケース 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 に答える