Android中DialogFragment如何使用,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)長期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為蕪湖企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè),蕪湖網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
基本用法
對于方法 ①,創(chuàng)建一個 Dialog 并返回它即可:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { //為了樣式統(tǒng)一和兼容性,可以使用 V7 包下的 AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // 設(shè)置主題的構(gòu)造方法 // AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.CustomDialog); builder.setTitle("注意:") .setMessage("是否退出應(yīng)用?") .setPositiveButton("確定", null) .setNegativeButton("取消", null) .setCancelable(false); //builder.show(); // 不能在這里使用 show() 方法 return builder.create(); }
當(dāng)然,你也可以使用自定義 View 來創(chuàng)建:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // 設(shè)置主題的構(gòu)造方法 // AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.CustomDialog); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_dialog, null); builder.setView(view) // Do Someting,eg: TextView tv = view.findViewById(R.id.tv); return builder.create(); }
PS:創(chuàng)建 Dialog 的方式有多種,比如下面這種,使用時略有差異,需要自己注意:
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_dialog, null); Dialog dialog = new Dialog(getActivity()); // 設(shè)置主題的構(gòu)造方法 // Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog); dialog.setContentView(view); // Do Someting return dialog; }
對于方法 ②,和普通的 Fragment 用法基本一致:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_dialog, container, false); // Do Someting return rootView; } /** * 設(shè)置主題需要在 onCreate() 方法中調(diào)用 setStyle() 方法 */ @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog); }
處理屏幕翻轉(zhuǎn)
如果使用傳統(tǒng)的 Dialog ,需要我們手動處理屏幕翻轉(zhuǎn)的情況,但使用 DialogFragment 的話,則不需要我們進(jìn)行任何處理,F(xiàn)ragmentManager 會自動管理 DialogFragment 的生命周期。
無標(biāo)題欄/全屏
在基本用法里代碼注釋有設(shè)置主題的地方,下面詳細(xì)說下兩種方法下設(shè)置無標(biāo)題欄和實現(xiàn)全屏的方式:
無標(biāo)題欄
對于方法 ① :
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_dialog, null); Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog); // 關(guān)閉標(biāo)題欄,setContentView() 之前調(diào)用 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.setCanceledOnTouchOutside(true); return dialog; }
對于方法 ②:
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * setStyle() 的第一個參數(shù)有四個可選值: * STYLE_NORMAL|STYLE_NO_TITLE|STYLE_NO_FRAME|STYLE_NO_INPUT * 其中 STYLE_NO_TITLE 和 STYLE_NO_FRAME 可以關(guān)閉標(biāo)題欄 * 每一個參數(shù)的詳細(xì)用途可以直接看 Android 源碼的說明 */ setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog); }
實現(xiàn)全屏(寬/高度全屏)
常用的形式大多是寬度上和屏幕一樣寬,高度自適應(yīng),下面直接看代碼:
方法 ① :
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_dialog, null); Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.setCanceledOnTouchOutside(true); //Do something // 設(shè)置寬度為屏寬、位置靠近屏幕底部 Window window = dialog.getWindow(); window.setBackgroundDrawableResource(R.color.transparent); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(wlp); return dialog; }
代碼 12 行設(shè)置了窗口的背景色為透明,這一步是必須的;
代碼 15 行設(shè)置窗口的寬度為 MATCH_PARENT,效果是和屏幕寬度一樣大,同樣你也可以設(shè)置高度的值。設(shè)置寬度和高度除了 MATCH_PARENT 和 WRAP_CONTENT ,也可以直接設(shè)置成具體的數(shù)值。
方法 ②:
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.CustomDialog); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setCanceledOnTouchOutside(true); View rootView = inflater.inflate(R.layout.fragment_dialog, container, false); //Do something // 設(shè)置寬度為屏寬、靠近屏幕底部。 final Window window = getDialog().getWindow(); window.setBackgroundDrawableResource(R.color.transparent); window.getDecorView().setPadding(0, 0, 0, 0); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; window.setAttributes(wlp); return rootView; }
代碼 14 行設(shè)置了窗口的背景色為透明,這一步是必須的;
代碼 15 行設(shè)置了窗口的 Pading 值全部為0,這一步也是必須的,內(nèi)容不能填充全部寬度和高度。
其他的和 ① 中的類似。
應(yīng)用場景區(qū)別
文章一開始簡單總結(jié)了方法 ① 和方法 ② 的應(yīng)用場景,這里說明下:
1. 從基本的用法中可以看到方法 ① 為簡單的替代 Dialog 提供了非常方便的創(chuàng)建方式,比方法 ② 有優(yōu)勢
2. 方法 ① 在使用了多線程(例如網(wǎng)絡(luò)請求)的情況下,不能正確的獲取當(dāng)前 Fragment 的狀態(tài),會產(chǎn)生空指針異常。方法 ② 則沒有此問題,而且,其創(chuàng)建方式默認(rèn)使用了自定義 View,更便于應(yīng)對復(fù)雜 UI 的場景。
這里舉例說明:方法 ① 和方法 ② 的//Do something
代碼處,我們進(jìn)行一些異步操作:
TextView title = rootView.findViewById(R.id.dialoag_tv); title.setText("Value A"); new SomeTask().execute(url); private class SomeTask extends AsyncTask<String, Void, Boolean> { @Override protected Boolean doInBackground(String... params) { // 一些網(wǎng)絡(luò)請求 // 成功時 return true; // 異常時 return false; } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); // if (!isVisible()) return; if (aBoolean) { title.setText("Value B"); } } }
看完上述內(nèi)容,你們掌握Android中DialogFragment如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前文章:Android中DialogFragment如何使用
轉(zhuǎn)載注明:http://jinyejixie.com/article36/jjphsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、企業(yè)網(wǎng)站制作、軟件開發(fā)、用戶體驗、建站公司、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)