web-dev-qa-db-ja.com

Android:なぜsetVisibility(View.GONE);またはsetVisibility(View.INVISIBLE);動作しない

最初にDatePickerとボタンが見えないようにします。そして、魔法のボタンを押すと、setVisibility(View.Visible);

ここでの問題は、I setVisibility(View.GONE)またはsetVisibility(View.INVISIBLE)何も変化せず、コンポーネントがまだ表示されている場合です。

final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
final Button btn2 = (Button) findViewById(R.id.btnDate2);

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

btn2.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        TextView txt2 = (TextView) findViewById(R.id.txt2);
        txt2.setText("You selected " + dp2.getDayOfMonth()
            + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear());
    }
});
50
nayden

かなりの数の間違いがあります。まず、マジックボタンを定義しておらず、そのためのイベントハンドラもありません。

また、使用しないでください:

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE); 

2つのうち1つだけを使用します。 Androidドキュメント から:

View.GONEこのビューは非表示であり、レイアウトのためにスペースを必要としません。

View.INVISIBLEこのビューは表示されませんが、レイアウトの目的のためにまだスペースを占有します。

この例では、View.GONE割り当てをView.INVISIBLE割り当てでオーバーライドしています。


交換してみてください:

final DatePicker dp2 = new DatePicker(this)

で:

DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);  

同様に他のウィジェットの場合:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);

        final DatePicker dp2 = new DatePicker(this);
        final Button btn2 = new Button(this);
        final Button magicButton = new Button(this);
        final TextView txt2 = new TextView(TestActivity.this);

        dp2.setVisibility(View.GONE);
        btn2.setVisibility(View.GONE);
        btn2.setText("set Date");

        btn2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                txt2.setText("You selected "
                    + dp2.getDayOfMonth() + "/" + (dp2.getMonth() + 1) 
                    + "/" + dp2.getYear());
            }
        });

        magicButton.setText("Magic Button");
        magicButton.setOnClickListener(new View.OnClickListener()    
            public void onClick(View arg0) {
                dp2.setVisibility(View.VISIBLE);
                btn2.setVisibility(View.VISIBLE);
            }
        });

    ll.addView(dp2);
    ll.addView(btn2);
    ll.addView(magicButton);
    ll.addView(txt2);

    setContentView(ll);
}
100
con_9

CSSスタイルの可視性と表示と考えることができます。

<div style="visibility:visible; display:block">
    This is View.VISIBLE : Content is displayed normally.
</div>

<div style="visibility:hidden; display:block">
    This is View.INVISIBLE : Content is not displayed, but div still takes up place, but empty.
</div>

<div style="display:none">
    This is View.GONE : Container div is not shown, you can say the content is not displayed.
</div>
8
az3

最初にコードを確認します。

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

ここでは、両方の可視性を同じフィールドに設定するので、それが問題です。そのためのサンプルを1つ提供します サンプルデモ

6
Parag Chauhan

今日、次のアクションを実行するシナリオがありました。

myViewGroup.setVisibility(View.GONE);

次のフレームで、私はifを実行して、そのビューの可視性状態をどこかで確認しました。そして何だと思う?次の条件が満たされていました。

if(myViewGroup.getVisibility() == View.VISIBLE) {
    // this if check was fulfilled magically
}

表示されるブレークポイントを配置すると、可視性はGONEに変わりますが、次のフレームで魔法のようにVISIBLEになります。どうしてこれが起こるのかを理解しようとしていました。

このビューにアニメーションが適用されていたことが判明しました。これにより、内部的には、アニメーションが完了するまでビューの可視性がVISIBLEに変更されました。

public void someFunction() {
    ...
    TransitionManager.beginDelayedTransition(myViewGroup);
    ...

    myViewGroup.setVisibility(View.GONE);
}

デバッグすると、myViewGroupが実際にその可視性をGONEに変更することがわかりますが、次のフレームでアニメーションが実行されるように再び見えるようになります。

そのため、このような状況に遭遇した場合は、ビューのアニメーション化中にifチェックを実行していないことを確認してください。

View.clearAnimation() を使用して、ビュー上のすべてのアニメーションを削除できます。

4
azizbekian

View.GONEこのビューは非表示であり、レイアウトのためにスペースを必要としません。

View.INVISIBLEこのビューは表示されませんが、レイアウトの目的のためにまだスペースを占有します。

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
1
Pankaj Talaviya

View.GONEは、ビューがレイアウト内のスペースを占有することなく、ビューを非表示にします。 View.INVISIBLEは、スペースを占有したままビューを非表示にします。

最初に同じビューでGONEを使用し、次にINVISIBLEを使用しています。コードが順次実行されるため、最初にビューがGONEになり、それでもスペースを占有するINVISIBLEタイプによってオーバーライドされます。

ボタンにボタンリスナーを追加し、onClick()メソッド内にビューを表示する必要があります。これは、onCreate()メソッドでの私によるロジックです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);

    final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
    final Button btn2 = (Button) findViewById(R.id.btnDate2);

    dp2.setVisibility(View.INVISIBLE);
    btn2.setVisibility(View.INVISIBLE);

    bt2.setOnClickListener(new View.OnCLickListener(){ 
    @Override
    public void onClick(View view)
    {
        dp2.setVisibility(View.VISIBLE);
        bt2.setVisibility(View.VISIBLE);
    }
  });
}

これは簡単に機能するはずです。お役に立てれば。

0
Trishant Sharma

私の場合、可視性をGONEに設定する前に、ビューのアニメーションを単純にクリアすることができます。

dp2.clearAnimation();
dp2.setVisibility(View.GONE);

私は2つのビューを切り替える同様の問題があり、そのうちの1つは常にGONEとして開始する必要があります-しかし、ビューを再度表示すると、setVisibility(GONE)が呼び出されても最初のビューの上に表示されていました。ビューをGONEに設定する前にアニメーションをクリアすると機能しました。

0
Pierre