在其他布局设置为在真实设备上可见后,ImageButton不可见

时间:2016-08-20 08:38:29

标签: android onclicklistener visibility

我有一个ImageButton,点击它后会被移动(实现onClickListener),LinearLayoutImageButton设置为可见 {{1}单击(也在其onClick方法中)。

奇怪的行为:在我的虚拟设备上,它可以正常工作,但在真实设备上,ImageButton设置为可见后,LinearLayout再次不可见< / em>的。我还将布局延迟(一秒钟)设置为可见并且ImageButton已正确移动,但正如我所说它不再是可见(当我也当LinearLayout设置为可见

,明确地将其设置为可见的

任何想法如何解决这个问题?

onClickListener实现(我知道硬编码的值没有响应,但App仅适用于一个特定设备):

private void setUpMenuBar() {
    final LinearLayout menuLayout = (LinearLayout) findViewById(R.id.menu_layout);

    menuLayout.setVisibility(View.INVISIBLE);
    final int menuLayoutWidth = menuLayout.getWidth();
    final ImageButton openMenuBtn = (ImageButton) findViewById(R.id.btn_open_menu);
    openMenuBtn.setOnClickListener(new View.OnClickListener() {
        boolean menuVisible = false;
        @Override
        public void onClick(View v) {
            Log.d("onClick", "menu visible: " + menuVisible + ", Rigth: " + openMenuBtn.getRight() + ", layoutWidth: " + menuLayoutWidth);
            if(menuVisible) {
                openMenuBtn.setRight(1920);
                openMenuBtn.setLeft(1720);
                menuLayout.setVisibility(View.INVISIBLE);
                menuVisible = false;
            }
            else {
                openMenuBtn.setRight(1520);
                openMenuBtn.setLeft(1320);
                menuLayout.setVisibility(View.VISIBLE);
                menuVisible = true;

            }
            Log.d("onClick", "menu visible: " + menuVisible + ", Rigth: " + openMenuBtn.getRight() + ", left: " + openMenuBtn.getLeft());
        }
    });
}

XML布局:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:src="@mipmap/arrow"
    android:background="@null"
    android:id="@+id/btn_open_menu"
    />
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/menu_layout"
    android:orientation="vertical"
    android:background="#000000"
    android:layout_gravity="right">
    <ImageButton
        android:layout_width="200dp"
        android:layout_height="20dp"
        android:layout_gravity="right"
        android:layout_weight="33"
        android:layout_marginBottom="2dp"
        android:src="@mipmap/zahnrad"
        android:background="@drawable/btn_menu_settings"/>
    <ImageButton
        android:layout_width="200dp"
        android:layout_height="20dp"
        android:layout_gravity="right"
        android:layout_weight="33"
        android:layout_marginBottom="2dp"
        android:src="@mipmap/schraubendreher"
        android:background="@drawable/btn_menu_settings"/>
    <ImageButton
        android:layout_width="200dp"
        android:layout_height="20dp"
        android:layout_gravity="right"
        android:layout_weight="34"
        android:src="@mipmap/fragezeichen"
        android:background="@drawable/btn_menu_settings_roundet"/>
</LinearLayout>

2 个答案:

答案 0 :(得分:1)

正如你所说,它适用于虚拟设备但不适用于真实设备。

您已将setLeft()setRight()的参数分别设置为1920和1720的巨大值。这可能会将ImageButton推出真实设备的屏幕,具体取决于设备包装的显示器像素。

尝试使用较小的参数值参考这些方法并查看,是否在显示时绘制视图。

答案 1 :(得分:0)

使用

获取显示高度和宽度
    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int width = displaymetrics.widthPixels;
    int height = displaymetrics.heightPixels;

然后从宽度和高度计算setRight值和setLeft值