View1在Android 4.0上的View2.setvisibility(view.INVISIBLE)后消失了

时间:2012-06-01 18:15:02

标签: android android-asynctask visibility android-4.0-ice-cream-sandwich glsurfaceview

在我的APP中,我得到了一个游戏任务栏,其中包含特定的游戏控制(control_1,control_2)。另外,我有两个按钮(Button_1,Button_2),我可以切换可见性。因为我有很多UI-Changes,所以我在asynctask的onPostexecute()中进行可见性切换。 这适用于Android 4.0之前的所有测试设备。但是,当切换其中一个按钮的可见性时,> 4.0设备会删除我的gametaskbar的背景图像。 这不应该发生,我没有更多的想法在哪里看。

我在视图层次结构的底部有一个带有glsurfaceview的framelayout。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/baseframe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" >

<LinearLayout
    android:id="@+id/glSurfaceHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</LinearLayout>

<LinearLayout
    android:id="@+id/GameTaskbar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_gravity="bottom"
    android:background="@drawable/bar"
    android:orientation="horizontal"
    android:visibility="invisible" >

    <Button
        android:id="@+id/control_1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:layout_margin="1dp"
        android:background="@drawable/blind" >
    </Button>

    <Button
        android:id="@+id/control_2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:layout_margin="1dp"
        android:background="@drawable/blind" >
    </Button>   
</LinearLayout>
<Button
    android:id="@+id/Button_1"
    android:layout_width="75dp"
    android:layout_height="50dp"
    android:layout_gravity="right|center_vertical"
    android:background="@drawable/drop_64"
    android:visibility="invisible" >
</Button>

<Button
    android:id="@+id/Button_2"
    android:layout_width="75dp"
    android:layout_height="50dp"
    android:layout_gravity="left|center_vertical"
    android:background="@drawable/back_64"
    android:visibility="invisible" >
</Button>
</FrameLayout>

这是我切换visibilty的部分:

protected void onPostExecute() {
if(button_1_state){
    Button_1.setVisibility(View.VISIBLE);
}
else{
    Button_1.setVisibility(View.INVISIBLE);
}
if(button_2_state){
    Button_2.setVisibility(View.VISIBLE);
}
else{
    Button_2.setVisibility(View.INVISIBLE);
}

...
 }

根据这篇文章(Error when refreshing View on top of SurfaceView),我能够将Android4.0特定的不需要的行为减少到不需要的backgroundvisibilityswitch。

我还在按钮上尝试了requestFocus()而没有运气。

当我调试它时,一切看起来都应该和gametaskbar.getVisibility()= 0.但是在离开async-onPostexecute()之后,backgroundimage就会消失。当我在这种情况下不将buttonvisibility切换为隐形时,backgroundimage也会保留。就像我使用错误的ID,我没有。

即使在模拟器中,我也可以重现这种行为。

ps:按钮可见性按需要更改

也许有人有个主意。

1 个答案:

答案 0 :(得分:0)

解决了这个问题: 使用GameTaskBar的backgrundimage将LinearLayout更改为另一个带有Imageview的FrameLayout,其中带有控件的原始LinearLayout下面的

<FrameLayout
    android:id="@+id/GameTaskbar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_gravity="bottom"
    android:visibility="invisible" >

    <ImageView
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:src="@drawable/bar_512_2"
        android:contentDescription="@string/bar"/>

    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <Button
            android:id="@+id/control_1"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="bottom"
            android:layout_margin="1dp"
            android:background="@drawable/blind" >
        </Button>

        <Button
            android:id="@+id/control_2"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="bottom"
            android:layout_margin="1dp"
            android:background="@drawable/blind" >
        </Button>   
    </LinearLayout>
</FrameLayout>

orn​​ay