简书链接:【原创】给实现dialogLifeCycleOwnerfragmnetactivity都齐了,再也不需要在onDestory进行取消
文章字数:207,阅读全文大约需要1分钟
activity和fragment都有了,dialog不加一个怎么行呢?
什么是 LifeCycleOwner 建议自己百度,它可以用在livedata,AutoDispose 来实现自动取消rxjava任务等等,用途多多。
但是传参数却需要LifeCycleOwner ,dialog是没有的,于是我徒手写了一个。
用法
1 2 3 4 5 6 7 8 9 10 11 12 13
| Dialog dialog=new Dialog(this); DialogLifeCycleOwner dialogLifeCycle=new DialogLifeCycleOwner(dialog); //由于接管了onDismiss,因此需要监听则需要通过此方法来实现监听。 dialogLifeCycle.setProxyOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { //dialog close } }); LifecycleOwner owner=dialogLifeCycle; //AutoDispose的用法 observe.to(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(owner))).subscribe(observer);
|
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Build; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout;
import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleRegistry;
import java.lang.ref.SoftReference;
/** * Author:Lozn * Email:[email protected] * 2021/12/4 * 10:33 */ public class DialogLifeCycleOwner implements LifecycleOwner {
private static class MyView extends View {
public void setLifecycleRegistrySoftReference(SoftReference<LifecycleRegistry> lifecycleRegistrySoftReference) { this.lifecycleRegistrySoftReference = lifecycleRegistrySoftReference; }
SoftReference<LifecycleRegistry> lifecycleRegistrySoftReference=null; public MyView(Context context) { super(context); }
@Override public boolean onTouchEvent(MotionEvent event) { return false; }
public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); }
@Override public void onVisibilityAggregated(boolean isVisible) { super.onVisibilityAggregated(isVisible); }
@Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if(lifecycleRegistrySoftReference.get()!=null){ lifecycleRegistrySoftReference.get().setCurrentState(visibility==VISIBLE?Lifecycle.State.STARTED:Lifecycle.State.INITIALIZED); //没有pause,那么可以移动到oncreate,或者onPause之前 } }
@Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if(lifecycleRegistrySoftReference.get()!=null){ lifecycleRegistrySoftReference.get().setCurrentState(hasWindowFocus?Lifecycle.State.RESUMED:Lifecycle.State.INITIALIZED);
//没有pause,那么可以移动到oncreate,或者onPause之前 } }
} public DialogLifeCycleOwner(Dialog dialog) { lifecycleRegistry = new LifecycleRegistry(this); lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED); /* dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { lifecycleRegistry.setCurrentState(Lifecycle.State.STARTED); if (proxyOnShowListener != null) { proxyOnShowListener.onShow(dialog);
} } });*/ MyView view = new MyView(dialog.getContext()); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(1, 1); params.gravity= Gravity.RIGHT|Gravity.CENTER;
dialog.addContentView(view, params);
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { lifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED); if (proxyOnDismissListener != null) { proxyOnDismissListener.onDismiss(dialog); } } }); }
public void setProxyOnDismissListener(DialogInterface.OnDismissListener proxyOnDismissListener) { this.proxyOnDismissListener = proxyOnDismissListener; }
/* public void setProxyOnShowListener(DialogInterface.OnShowListener proxyOnShowListener) { this.proxyOnShowListener = proxyOnShowListener; }*/ DialogInterface.OnDismissListener proxyOnDismissListener; // DialogInterface.OnShowListener proxyOnShowListener; private LifecycleRegistry lifecycleRegistry;
@Override public Lifecycle getLifecycle() { return lifecycleRegistry; }
}
|
2022-11-10 17:24:07
官方已经有了更好的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class MyActivity extends Activity implements LifecycleOwner { private LifecycleRegistry lifecycleRegistry;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this); lifecycleRegistry.markState(Lifecycle.State.CREATED); }
@Override public void onStart() { super.onStart(); lifecycleRegistry.markState(Lifecycle.State.STARTED); }
@NonNull @Override public Lifecycle getLifecycle() { return lifecycleRegistry; } }
|