Android:なぜSetVisibility(view.gone);またはsetVisibility(view.invisible);動作しない
-
27-10-2019 - |
質問
私は私のものが欲しい DatePicker
そして、最初に見えないボタン。魔法のボタンを押すと、Visibility(View.Visible)をsetにしたい。
ここでの問題は、私です 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());
}
});
解決
私はかなり間違っていることを見ています。まず第一に、魔法のボタンが定義されておらず、イベントハンドラーはありません。
また、使用しないでください:
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
2つのうちの1つだけを使用します。から Androidドキュメント:
ビュー。このビューは目に見えないので、レイアウトの目的でスペースをとることはありません。
View.Invisibleこのビューは目に見えませんが、レイアウトの目的でスペースを占有します。
あなたの例では、あなたはオーバーライドしています View.GONE
での割り当て View.INVISIBLE
1。
交換してみてください:
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);
}
他のヒント
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>
最初にあなたのコードを参照してください:
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
ここでは、両方の可視性を同じフィールドに設定して、それが問題です。そのために1つのサンプルを提供します サンプルデモ
今日、私は次のアクションを実行していたシナリオを持っていました:
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().
ビュー。このビューは目に見えないので、レイアウトの目的でスペースをとることはありません。
View.Invisibleこのビューは目に見えませんが、レイアウトの目的でスペースを占有します。
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
ビュー。レイアウト内のスペースを占めるビューなしで、ビューを見えないようにします。 View.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);
}
});
}
これは簡単に機能するはずだと思います。お役に立てれば。
私の場合、可視性を設定する前に、ビューでアニメーションをクリアするだけであることがわかりました GONE
作品。
dp2.clearAnimation();
dp2.setVisibility(View.GONE);
同様の問題があり、2つのビューを切り替えましたが、そのうちの1つは常にとして開始する必要があります GONE
- しかし、私が再びビューを表示したとき、それは最初のビューに表示されていました setVisibility(GONE)
と呼ばれていました。ビューを設定する前にアニメーションをクリアします GONE
働いた。
SetVisibilityは私にとってもうまくいきません
fabCamera.setVisibility(View.GONE);
そのエラーは次のとおりです。
VisibilityAwareImageButton.setVisibility can only be called from within the same library group (groupId=com.google.android.material)
私はAndroidxにいて、インポートしようとしました com.google.android.material
しかし、それはうまくいきませんでした
視認性を真または偽のどちらかを設定するからです。それを試してみてくださいsetVisible(0)
目に見える真の。and setVisible(4)
目に見える偽りに。