web-dev-qa-db-ja.com

android最初に非表示に設定した場合、setVisibilityは表示されません

全画面を占める表面が見えます。ボタンをクリックするだけで、別のレイアウトを表示したい(設定の種類)。オーバーレイが表示されている状態で開始すると、オーバーレイを非表示にしてから、問題なく再び表示できます。しかし、私がそれを目に見えないものから始めた場合、それを二度と目に見えるようにすることはできません。コードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >

    <Android.opengl.GLSurfaceView
    Android:id="@+id/glPlaySurface"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >
</Android.opengl.GLSurfaceView>

<RadioGroup
    Android:id="@+id/radioGroup1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:orientation="horizontal" >

    <RadioButton
        Android:id="@+id/btnRotate"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="10dp"
        Android:checked="true"
        Android:text="R"
        Android:textColor="#000" />

    <RadioButton
        Android:id="@+id/btnPan"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="15dp"
        Android:text="P"
        Android:textColor="#000" />
</RadioGroup>

<Button
    Android:id="@+id/btnLights"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_marginLeft="15dp"
    Android:layout_toRightOf="@+id/radioGroup1"
    Android:text="Lights" />

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/layoutLights"
    Android:layout_width="100dp"
    Android:layout_height="100dp"
    Android:visibility="visible" <--- Does not work if set to invisible
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentRight="true"

    Android:background="#fff" >

    <Button
    Android:id="@+id/btnLightsOK"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_marginLeft="15dp"
    Android:text="OK" />

    <Button
    Android:id="@+id/btnLights"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_marginLeft="15dp"
    Android:text="OK" />

</RelativeLayout>

</RelativeLayout>


private OnClickListener mOnLightsClick = new OnClickListener() {
    public void onClick(View arg0) {
        if(mLayoutLights.getVisibility() == View.VISIBLE) {
            mLayoutLights.setVisibility(View.INVISIBLE);
        }
        else {
            mLayoutLights.setVisibility(View.VISIBLE);
        }
    }
};
21
user1248322

とった。レイアウトだけでなく、レイアウト内のすべてのアイテムの可視性を設定する必要があります。したがって、このコードは機能しました:

if (mLayoutLights.getVisibility() == View.VISIBLE) {
    ((Button) findViewById(R.id.btnLightsOK)).setVisibility(View.GONE);
((Button) findViewById(R.id.btnLightsCnc)).setVisibility(View.GONE);
mLayoutLights.setVisibility(View.GONE);
} else {
    mLayoutLights.setVisibility(View.VISIBLE);
((Button) findViewById(R.id.btnLightsOK)).setVisibility(View.VISIBLE);
((Button) findViewById(R.id.btnLightsCnc)).setVisibility(View.VISIBLE);
}
15
user1248322

同様のエラーがありましたが、UiThreadを使用しないという私の愚かな間違いが原因でした。

Activity act = (Activity)context;
act.runOnUiThread(new Runnable(){
@Override
public void run() {
    mLayoutLights.setVisibility(View.VISIBLE);  
} });
27
Martin Sykes

私の場合、プレーンなSurfaceViewを使用して、ビューをINVISIBLEではなくxmlでGONEに設定するだけです。その後、VISIBILITYを正しく設定できます。

10
Thomas

3つの独立したものを試すことをお勧めします。

  1. レイアウトの幅と高さを変更してコンテンツをラップすると、親のマッチングで問題が発生する可能性があります。
  2. ビューでbringToFrontを呼び出す
  3. FrameLayoutでsurfaceViewをラップする(これは#2に関連していますが、それでも役立つ場合があります)

calendarViewを可視性 "VISIBLE"に設定し、 "findById"で見つけた後にinflateView/OnCreateViewで "GONE"に設定すれば、それを使って好きなことができます。

calendarView =(CalendarView)view.findViewById(R.id.all_scores_calendar_view); calendarView.setVisibility(View.GONE);

calendarView.setVisibility(View.VISIBLE);

1
Idan Damri

私は同じ問題に直面し、デバッグログは可視性が正しく設定されていることを明確に示していました。

私はデータバインディングを使用していました。私にとっては、以下の解決策がうまくいきました。

_activity.runOnUiThread(() -> binding.getRoot().post(() -> {
    binding.additionalDataHolderOne.setVisibility(View.GONE);
    binding.firstStreamHolder.setVisibility(View.VISIBLE);
}));
_

実際、binding.getRoot().post(() -> {});が仕事をしました。

0
Ifta

(私にとっても)動作しない理由はありませんが、回避策として次のことができます。

 val params = mLayoutLights.layoutParams
    if (shoouldShow()) {
        params.height = WRAP_CONTENT
    } else {
        params.height = 0
    }
    mLayoutLights.layoutParams = params
0
mspapant