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

ImageButton is not visible after other layout is set to visible on real device

我有一个 ImageButton 将在单击后移动(已实现 onClickListener)和一个 LinearLayout 将设置为 visibleImageButton 单击(也在其 onClick 方法中)。

奇怪的行为: 在我的虚拟设备上它工作正常但在真实设备上 ImageButtonLinearLayout 设置为可见。我还将布局延迟(一秒钟)设置为 visible 并且 ImageButton 已正确移动,但正如我所说,它不是 visibleLinearLayout 设置为 visible 时再次(也是当我将其明确设置为 VISIBLE 时)

有解决此问题的想法吗?

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

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>

使用

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

然后根据宽度和高度计算setRight值和setLeft值

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

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

尝试对这些方法使用较小的参数值,看看它是否绘制了显示的视图。