最初に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());
}
});
かなりの数の間違いがあります。まず、マジックボタンを定義しておらず、そのためのイベントハンドラもありません。
また、使用しないでください:
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);
}
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.GONEこのビューは非表示であり、レイアウトのためにスペースを必要としません。
View.INVISIBLEこのビューは表示されませんが、レイアウトの目的のためにまだスペースを占有します。
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
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);
}
});
}
これは簡単に機能するはずです。お役に立てれば。
私の場合、可視性をGONE
に設定する前に、ビューのアニメーションを単純にクリアすることができます。
dp2.clearAnimation();
dp2.setVisibility(View.GONE);
私は2つのビューを切り替える同様の問題があり、そのうちの1つは常にGONE
として開始する必要があります-しかし、ビューを再度表示すると、setVisibility(GONE)
が呼び出されても最初のビューの上に表示されていました。ビューをGONE
に設定する前にアニメーションをクリアすると機能しました。