[疑惑]:为什么不开放getEasyWindow实例的静态方法?
android-1995 opened this issue · 17 comments
android-1995 commented
问题描述【必填】
EasyWindow.cancelByTag(String tag)
框架开放了类似的cancel等静态方法,为什么不开放EasyWindow.getByTag(String tag)这样的静态方法?自己管理的话又得写逻辑,框架里已经有sWindowInstanceSet了,如果框架提供get实例的方法的话就不用重复写逻辑啦
框架文档是否提及了该问题【必答】
否
是否已经查阅框架文档但还未能解决的【必答】
是
issue 列表中是否有人曾提过类似的问题【必答】
否
是否已经搜索过了 issue 列表但还未能解决的【必答】
是
getActivity commented
getActivity commented
@android-1995 上面这些功能,要么框架使用者全部自己实现,要么框架作者来统一实现,不可能框架作者实现一半,剩下一半交给框架使用者实现,如果框架内部能实现就应该交给框架作者处理,而不是每一个使用框架的人都去自己实现一遍这样的功能,否则会造成一些重复工作。
getActivity commented
如果你需要在此之外的其他静态方法,可以描述你的具体需求和使用场景。
android-1995 commented
EasyWindow.getByClass(Class<? extends EasyWindow<?>> clazz)
EasyWindow.getByTag(String tag)
我目前的使用场景就是同时存在多个window,比如主window打开副window的时候隐藏主window,副window隐藏的时候打开主window,他们都只有一个实例,所以创建和显示的时候都想先通过getByTag(String tag)找到实例。
getActivity commented
getActivity commented
getActivity commented
@android-1995 这个功能我加上了,你可以下载上面的 aar 包测试一下。
android-1995 commented
getActivity commented
getActivity commented
@android-1995 你确定没有?
android-1995 commented
不一样的。existShowingByTag是easyWindow.isShowing(),我的是有实例,但是没showing,所以要把它show出来
getActivity commented
android-1995 commented
我写了个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();
}
}
getActivity commented
为什么不行?你先把 EasyWindow 对象创建出来,但是不去调用显示,后面直接用静态方法判断是否显示和调用显示。
android-1995 commented
上代码吧哥,我想不出来
getActivity commented
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");
}
android-1995 commented
可以实现。就是提早创建了实例,逻辑绕了点