getActivity/EasyWindow

[疑惑]:为什么不开放getEasyWindow实例的静态方法?

android-1995 opened this issue · 17 comments

问题描述【必填】

EasyWindow.cancelByTag(String tag)

框架开放了类似的cancel等静态方法,为什么不开放EasyWindow.getByTag(String tag)这样的静态方法?自己管理的话又得写逻辑,框架里已经有sWindowInstanceSet了,如果框架提供get实例的方法的话就不用重复写逻辑啦

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

image

@android-1995 上面这些功能,要么框架使用者全部自己实现,要么框架作者来统一实现,不可能框架作者实现一半,剩下一半交给框架使用者实现,如果框架内部能实现就应该交给框架作者处理,而不是每一个使用框架的人都去自己实现一遍这样的功能,否则会造成一些重复工作。

如果你需要在此之外的其他静态方法,可以描述你的具体需求和使用场景。

EasyWindow.getByClass(Class<? extends EasyWindow<?>> clazz)
EasyWindow.getByTag(String tag)

我目前的使用场景就是同时存在多个window,比如主window打开副window的时候隐藏主window,副window隐藏的时候打开主window,他们都只有一个实例,所以创建和显示的时候都想先通过getByTag(String tag)找到实例。

@android-1995 这个功能我加上了,你可以下载上面的 aar 包测试一下。

image
我现在的需求是显示Window前判断是否已经有实例,有就显示,没有就创建。你新加的API还是不能实现我的需求,直接提供get实例的方法更灵活

@android-1995 你确定没有?

不一样的。existShowingByTag是easyWindow.isShowing(),我的是有实例,但是没showing,所以要把它show出来

不一样的。existShowingByTag是easyWindow.isShowing(),我的是有实例,但是没showing,所以要把它show出来

image

我这次不是新增了 show 方法?

我写了个demo,新加的API不能实现以下需求吧?

package com.hjq.window.demo;

import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.hjq.window.EasyWindow;

import java.util.ArrayList;
import java.util.List;

public class TestActivity extends AppCompatActivity {
    private static final String TAG_WINDOW_1 = "window_1";
    private static final String TAG_WINDOW_2 = "window_2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        showWindow1();
    }

    /**
     * 通过tag获取实例列表
     */
    private static List<EasyWindow<?>> getByTag(String tag) {
        List<EasyWindow<?>> windows = new ArrayList<>();
        if (tag == null) {
            return windows;
        }
        for (EasyWindow<?> easyWindow : EasyWindow.sWindowInstanceSet) {
            if (easyWindow == null) {
                continue;
            }
            if (!tag.equals(easyWindow.getTag())) {
                continue;
            }
            windows.add(easyWindow);
        }
        return windows;
    }

    private void showWindow1() {
        List<EasyWindow<?>> windows = getByTag(TAG_WINDOW_1);
        if (!windows.isEmpty()) {
            //已有实例,直接显示
            windows.get(0).show();
            return;
        }
        //否则创建
        EasyWindow.with(this)
                .setTag(TAG_WINDOW_1)
                .setContentView(R.layout.window_hint)
                .setText(android.R.id.message, "主悬浮窗")
                .setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<View>() {
                    @Override
                    public void onClick(EasyWindow<?> easyWindow, View view) {
                        easyWindow.cancel();
                        showWindow2();
                    }
                })
                .show();
    }

    private void showWindow2() {
        List<EasyWindow<?>> windows = getByTag(TAG_WINDOW_2);
        if (!windows.isEmpty()) {
            //已有实例,直接显示
            windows.get(0).show();
            return;
        }
        //否则创建
        EasyWindow.with(this)
                .setTag(TAG_WINDOW_2)
                .setContentView(R.layout.window_hint)
                .setText(android.R.id.message, "副悬浮窗")
                .setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<View>() {
                    @Override
                    public void onClick(EasyWindow<?> easyWindow, View view) {
                        easyWindow.cancel();
                        showWindow1();
                    }
                })
                .show();
    }
}

为什么不行?你先把 EasyWindow 对象创建出来,但是不去调用显示,后面直接用静态方法判断是否显示和调用显示。

上代码吧哥,我想不出来

EasyWindow.with(this)
    .setDuration(1000)
    .setTag("1")
    .setContentView(R.layout.window_hint)
    .setAnimStyle(R.style.TopAnimStyle)
    .setImageDrawable(android.R.id.icon, R.drawable.ic_dialog_tip_finish)
    .setOnWindowLifecycle(new OnWindowLifecycle() {
        @Override
        public void onWindowCancel(EasyWindow<?> easyWindow) {
            EasyWindow.showByTag("2");
        }
    })
    .setText(android.R.id.message, "我是悬浮窗 1");

EasyWindow.with(this)
    .setDuration(1000)
    .setTag("2")
    .setContentView(R.layout.window_hint)
    .setAnimStyle(R.style.TopAnimStyle)
    .setImageDrawable(android.R.id.icon, R.drawable.ic_dialog_tip_finish)
    .setOnWindowLifecycle(new OnWindowLifecycle() {
        @Override
        public void onWindowCancel(EasyWindow<?> easyWindow) {
            EasyWindow.showByTag("1");
        }
    })
    .setText(android.R.id.message, "我是悬浮窗 2");

if (!EasyWindow.existShowingByTag("1")) {
    EasyWindow.showByTag("1");
}

可以实现。就是提早创建了实例,逻辑绕了点