Android开发画布销毁,Android DialogFragment 在页面销毁下的使用方式
今天看到了一篇文章,講了DialogFragment的封裝方式(Android:我為何要封裝DialogFragment?),想到當(dāng)初也為頁(yè)面銷毀后DialogFragment的回調(diào)方式頭疼了好久,看到了po主的思路,與當(dāng)初自己想的不太一樣,就整理一下.
如何在開(kāi)發(fā)中遇到頁(yè)面銷毀的情況
在android開(kāi)發(fā)中,頁(yè)面銷毀是個(gè)必須要考慮的一個(gè)問(wèn)題.由于現(xiàn)在android手機(jī)性能越來(lái)越強(qiáng),及自己在開(kāi)發(fā)中其實(shí)是很難碰到頁(yè)面銷毀的情況,可以在手機(jī)設(shè)置-開(kāi)發(fā)者選項(xiàng)中-不保留活動(dòng)選項(xiàng)選中.這樣在app使用中,按下home鍵后,再回到app中,頁(yè)面就會(huì)重新onCreate.(由于我在開(kāi)發(fā)中使用genimotion模擬器,某些情況下按下home鍵,再立即回到app中是不會(huì)銷毀的,可以在按下home鍵后,再開(kāi)個(gè)別的app后,再回到自己的app中)
思想
一般設(shè)計(jì)的方式,是將回調(diào)的listener傳遞到DialogFragment的實(shí)例中,頁(yè)面銷毀后實(shí)例中保存的listener對(duì)象就會(huì)丟失.由于listener通常指向的是宿主本身,所以也無(wú)法通過(guò)onSaveInstance()方法保存,那么主動(dòng)去獲取呢?
實(shí)現(xiàn)思路
在DialogFragment的實(shí)例中現(xiàn)將接該dialog中需要的接口定義好
宿主(activity或fragment)實(shí)現(xiàn)該接口
DialogFragment的實(shí)例中通過(guò)getActivity獲取activity對(duì)象,或者通過(guò)getTargetFragment獲取fragment對(duì)象,由于宿主本身實(shí)現(xiàn)了需要的回調(diào)接口,可以通過(guò)強(qiáng)轉(zhuǎn)直接調(diào)用接口中定義的方法
創(chuàng)建BaseDialogFragment
public class BaseDialogFragment extends DialogFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...根據(jù)自己的需求
}
/**
* 為獲取接口類型定義的一個(gè)輔助方法 簡(jiǎn)化每次都要強(qiáng)轉(zhuǎn)的麻煩
* @param listenerInterface
* @param
* @return
*/
protected T getDialogListener(Class listenerInterface) {
//用targetFragment是否為空來(lái)標(biāo)識(shí)是fragment還是activity開(kāi)啟的這個(gè)DialogFragment
final Fragment targetFragment = getTargetFragment();
if (targetFragment != null && listenerInterface.isAssignableFrom(targetFragment.getClass())) {
return (T) targetFragment;
}
if (getActivity() != null && listenerInterface.isAssignableFrom(getActivity().getClass())) {
return ((T) getActivity());
}
return null;
}
}
一個(gè)簡(jiǎn)單的DialogFragment實(shí)現(xiàn)
public class ConfirmDialogFragment extends BaseDialogFragment {
/**
* 定義該dialog需要的回調(diào)方法
*/
public interface IConfirmDialogListener{
void onConfirmDialogPositiveListener();
void onConfirmDialogCancelListener();
}
private IConfirmDialogListener getConfirmDialogListener(){
return getDialogListener(IConfirmDialogListener.class);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//程序簡(jiǎn)單起見(jiàn) 直接使用該方法創(chuàng)建一個(gè)dialog
AlertDialog.Builder b = new AlertDialog.Builder(getActivity())
.setTitle("title")
.setMessage("msg")
.setPositiveButton("確認(rèn)", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getConfirmDialogListener().onConfirmDialogPositiveListener();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getConfirmDialogListener().onConfirmDialogCancelListener();
}
});
return b.create();
}
}
在activity中使用dialog
public class MainActivity extends AppCompatActivity implements ConfirmDialogFragment.IConfirmDialogListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ConfirmDialogFragment dialogFragment = new ConfirmDialogFragment();
dialogFragment.show(getSupportFragmentManager(),"tag");
}
@Override
public void onConfirmDialogPositiveListener() {
//確認(rèn)事件
}
@Override
public void onConfirmDialogCancelListener() {
//取消事件
}
}```
#### 在fragment中使用
public class FeatureFragment extends Fragment implements ConfirmDialogFragment.IConfirmDialogListener{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
showDialog();
//演示用 這里就不去創(chuàng)建布局了
return super.onCreateView(inflater, container, savedInstanceState);
}
private void showDialog() {
ConfirmDialogFragment dialogFragment = new ConfirmDialogFragment();
//設(shè)置target用于在dialogFragment中區(qū)分context是activity還是fragment 第二個(gè)參數(shù)為 requestCode 方便書寫這里為0
dialogFragment.setTargetFragment(this,0);
dialogFragment.show(getChildFragmentManager(),"tag");
}
@Override
public void onConfirmDialogPositiveListener() {
//確認(rèn)事件
}
@Override
public void onConfirmDialogCancelListener() {
//取消事件
}
}
#### 缺點(diǎn)
- 宿主需要先實(shí)現(xiàn)接口,不能通過(guò)匿名內(nèi)部類的方式傳遞
- 如果一個(gè)activity需要彈出多個(gè)對(duì)話框,宿主本身會(huì)override很多方法
#### 未實(shí)現(xiàn)功能
- 一個(gè)activity多次彈出dialog,每次按鈕有不同的功能,需要加入回調(diào)參數(shù)來(lái)區(qū)分 (待更新)
待更新
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Android开发画布销毁,Android DialogFragment 在页面销毁下的使用方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10查看pcie设备_壹拓网科技解
- 下一篇: java参考文献