Это floagingview.It можно перетащить ...
Мне нужно настроить макет, чтобы скрыть или показать в коде.
проблема : listview_left 、 listview_left нет способа скрыть или показать

< Сильный > FloatingView.java
Этот код имеет скрытые настройки, но не имеет никакого эффекта.
listview_left.setVisibility (View.GONE) и listview_right.setVisibility (View.GONE)

public FloatingView(Context context, FloatingViewConfig config) {
    this.mContext = context;
    mWindowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);
    rootView = LayoutInflater.from(context).inflate(R.layout.playground_float_view, null, false);

    this.config = config;
    if (config.displayWidth == Integer.MAX_VALUE) {
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        config.displayWidth = metrics.widthPixels;
    }
    if (config.displayHeight == Integer.MAX_VALUE) {
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        config.displayHeight = (int) (metrics.heightPixels - 25 * metrics.density);
    }
    config.paddingLeft = dp2px(config.paddingLeft);
    config.paddingTop = dp2px(config.paddingTop);
    config.paddingRight = dp2px(config.paddingRight);
    config.paddingBottom = dp2px(config.paddingBottom);

    rootView.measure(0, 0);
    width = rootView.getMeasuredWidth();
    height = rootView.getMeasuredHeight();

    screen_widht = mWindowManager.getDefaultDisplay().getWidth();
    screen_height = mWindowManager.getDefaultDisplay().getHeight();
    mFloatLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.playground_float_view, null);
    listview_left =  mFloatLayout.findViewById(R.id.listview_left);
    listview_right =  mFloatLayout.findViewById(R.id.listview_right);
    x = 0;
    y = 0;
    listview_left.setVisibility(View.GONE);
    listview_right.setVisibility(View.GONE);
    Log.d(TAG,"初始化(left,right) : " + listview_left.getVisibility() + ", " + listview_right.getVisibility());
}

< Сильный > float_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/float_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/floating_layout_shape"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/listview_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list2" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list3" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list1" />
    </LinearLayout>


    <ImageView
        android:id="@+id/float_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/floating_view_menu"/>

    <LinearLayout
        android:id="@+id/listview_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/float_image"
        android:visibility="visible">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list3" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/floating_view_list2" />
    </LinearLayout>


</LinearLayout>



Это полный код, и он запускается !!!
ссылка: https://github.com/sheng855174/Test
Как я могу решить?

1
陳昇昇 11 Фев 2020 в 07:00

2 ответа

Лучший ответ

Ответ здесь хороший, но, возможно, он был неверно истолкован. Я попытаюсь объяснить это по-другому здесь https://stackoverflow.com/a/60161868/910718

mFloatLayout должен быть полностью заменен на rootView, если дважды накачать макет, это означает, что у вас есть 2 совершенно разные версии этого макета, одна в mFloatLayout и другая в rootView. Изменения в mFloatLayout ничего не изменят на View в rootView.

Я вижу, что представление добавлено здесь:

    public void showOverlayActivity() {
    if (isShowing) {
        return;
    }
    type = TYPE.OVERLAY_ACTIVITY;
    initParams();
    initPosition();
    initWindowView();
    isShowing = true;
    mWindowManager.addView(rootView, mParamsWindowManager);
}

Таким образом, View, отображаемый на экране, не является View, из которого вы извлекли listview_left и listview_right, потому что, как указано, второй инфляционный файл создает полностью новый экземпляр макета без связи с макетом, который добавляется на экран в этом коде.

Я бы рекомендовал FloatingView расширить LinearLayout, чтобы внешний LinearLayout был заменен тегом merge, и чтобы View.inflate вот так: inflate(context, R.layout.playground_float_view, this) . Это делает FloatingView равным макету float_view, а mFloatLayout и rootView становятся ненужными.

2
Dandre Allison 11 Фев 2020 в 04:21

Вам не нужно раздувать playground_float_view 2 раза.

Просто удалите строку ниже из вашего кода -

mFloatLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.playground_float_view, null);

И получите listview_left и listview_left, как показано ниже -

listview_left =  (LinearLayout)rootView.findViewById(R.id.listview_left);
listview_right =  (LinearLayout)rootView.findViewById(R.id.listview_right);

Надеюсь это поможет !!

1
Dipankar Baghel 11 Фев 2020 в 04:05