質問

私は私のものが欲しい 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) 目に見える偽りに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top