66

最初は自分DatePickerとボタンが見えないようにしたい。そして、魔法のボタンを押すと、Visibility(View.Visible);を設定したいと思います。

ここでの問題は、私が何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());
    }
});
4

11 に答える 11

124

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

また、次のものは使用しないでください。

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);
}
于 2011-09-08T13:08:53.890 に答える
14

今日、私は次のようなシナリオを実行しました。

myViewGroup.setVisibility(View.GONE);

次のフレームifで、そのビューの可視性の状態を別の場所でチェックしていました。何だと思う?次の条件が通過しました:

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

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

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

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

    myViewGroup.setVisibility(View.GONE);
}

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

したがって、このような状況に遭遇した場合はif、ビューをアニメートしている最中にチェックインを実行していないことを確認してください。

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

于 2017-01-03T23:16:52.263 に答える
12

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>
于 2013-03-04T11:10:35.463 に答える
6

最初にコードを確認してください。

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

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

于 2011-09-08T13:00:58.507 に答える
4

私の場合、可視性をGONE機能に設定する前に、ビューのアニメーションをクリアするだけであることがわかりました。

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

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

于 2019-08-29T07:38:07.943 に答える
1

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

View.INVISIBLEこのビューは非表示ですが、レイアウトのためにスペースを占有します。

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
于 2016-08-30T11:50:10.260 に答える
1

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);
    final Button btn3 = (Button) findViewById(R.id.btnVisibility);

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

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

これは簡単に機能するはずだと思います。お役に立てれば。

于 2018-02-28T11:22:00.087 に答える
1

これは、すべての答えを試しても失敗した人のためのものです。ピエールの答えを拡張します。アニメーションを使用している場合は、可視性を設定するGONEか、INVISIBLEまたは機能しinvalidate()ません。以下の解決策を試してください。`

btn2.getAnimation().setAnimationListener(new Animation.AnimationListener() {
     @Override
     public void onAnimationStart(Animation animation) {
     }
     @Override
     public void onAnimationEnd(Animation animation) {
         btn2.setVisibility(View.GONE);
         btn2.clearAnimation();
     }
     @Override
     public void onAnimationRepeat(Animation animation) {
     }
});

`

于 2019-11-24T14:16:21.397 に答える
0

私も同じ問題に直面していました。特定のフラグメントがさまざまな画面で膨らんでいるとすると、膨らんだときに条件がリセットされた可能性があるため、ifステートメント内で設定された可視性モードが必要に応じて機能しない可能性があります私たちのアプリで何度も。

私の場合、別のフラグメント(親フラグメント)でクリックされたボタンに基づいて、あるフラグメント(子フラグメント)の可視性モードを変更する必要があります。そこで、buttonClickedブール値を親フラグメントの変数に格納し、それをパラメーターとして子フラグメントの関数に渡しました。したがって、子フラグメントの可視性モードは、パラメーターを介して受信したブール値に基づいて変更されます。ただし、この子フラグメントはさまざまな画面で膨らんでいるため、View.GONEを使用して非表示にした場合でも、表示モードはリセットされ続けました。

この競合を回避するために、子フラグメントで静的ブール変数を宣言し、そのブール値が親フラグメントから受信されるたびに、静的変数に格納してから、子フラグメントの静的変数に基づいて可視性モードを変更しました。 。

それは私にとって問題を解決しました。

于 2020-10-21T12:58:00.657 に答える
0

私は一度同じ問題を抱えていました。可視性を変更した後にinvalidを呼び出すと、ほとんどの場合機能しますが、機能しない場合もあります。チートして背景を透明な画像に設定し、テキストを「」に設定する必要がありました。

于 2020-11-13T11:19:25.327 に答える
-25

可視性をtrueまたはfalseに設定したためです。setVisible(0)真に見えるように してみてください 。and setVisible(4)目に見える偽に。

于 2011-09-08T12:44:07.880 に答える