【安卓筆記】使用DialogFragment託管dialog
普通的AlertDialog
在橫豎屏切換時會被銷燬,如果dialog上面有資料,也將丟失。解決方案是使用DialogFragment。
使用dialogFragment
通常需要複寫兩個方法:
onCreateView(LayoutInflater, ViewGroup, Bundle)
onCreateDialog(Bundle)
如果你想自定義dialog樣式,只需要複寫onCreateView
,注入一個自定義的view即可,然後通過呼叫DialogFragment#show()方法即可。
這裡我們不需要自定義,只需要託管AlertDialog
即可,所以我們僅僅需要複寫onCreateDialog
方法。在這個方法內部我們需要通過AlertDialog.Builder
構建一個dialog並返回,dialog的引數可以通過setArguments
注入。具體程式碼如下:
package com.taobao.dialogfragmentdemo;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
public class AlertDialogFragment extends DialogFragment
{
private static final String PARAM_TITLE = "title";
private static final String PARAM_CONTENT = "content";
private static DialogCallback mCallback;
public AlertDialogFragment()
{
}
public static AlertDialogFragment newInstance(String title,String content,DialogCallback callback)
{
AlertDialogFragment instance = new AlertDialogFragment();
Bundle bundle = new Bundle();
bundle.putString(PARAM_TITLE,title);
bundle.putString(PARAM_CONTENT,content);
instance.setArguments(bundle);
mCallback = callback;
return instance;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
Bundle params = getArguments();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(params.getString(PARAM_TITLE));//沒有做非空判斷,按需新增
builder.setMessage(params.getString(PARAM_CONTENT));
builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if(mCallback != null)
mCallback.onPostiveClick();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if(mCallback != null)
mCallback.onNegativeClick();
}
});
return builder.show();
}
public interface DialogCallback
{
public void onPostiveClick();
public void onNegativeClick();
}
}
想使用也很簡單:
AlertDialogFragment dialog = AlertDialogFragment.newInstance("標題", "這是fragment託管的alertdialog", new AlertDialogFragment.DialogCallback()
{
@Override
public void onPostiveClick()
{
Toast.makeText(MainActivity.this,"確定",Toast.LENGTH_SHORT).show();
}
@Override
public void onNegativeClick()
{
Toast.makeText(MainActivity.this,"取消",Toast.LENGTH_SHORT).show();
}
});
dialog.show(getSupportFragmentManager(),"dialog");
還可以通過DialogFragment#show
的第二個引數tag來找到對應的dialogFragment:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment prevDialog = getSupportFragmentManager().findFragmentByTag("dialog");
if(prevDialog != null)
{
transaction.remove(prevDialog);
}
相關文章
- 使用DialogFragment定義自己的DialogFragment
- 使用GitHub託管專案Github
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- 《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之記憶體託管物件與非託管物件Swift筆記框架記憶體物件
- 一步一步使用 DialogFragment 封裝鏈式呼叫 DialogFragment封裝
- 託管堆記憶體佔用記憶體
- 委託筆記筆記
- 託管與非託管的混合程式設計程式設計
- 【安卓筆記】CardView+RecyclerView使用示例安卓筆記View
- C# 託管資源和非託管資源C#
- Android彈窗元件工作機制之Dialog、DialogFragment(一)Android元件Fragment
- 伺服器託管伺服器
- Oracle 託管檔案Oracle
- 華為開發者 雲託管
- 【安卓筆記】Widget安卓筆記
- 伺服器託管是什麼意思,為什麼要託管?伺服器
- 康託の複習筆記筆記
- 重學c#系列——c# 託管和非託管資源(三)C#
- [.net 物件導向程式設計進階] (8) 託管與非託管物件程式設計
- 安卓Glide(4.7.1)使用筆記 01 - 引入專案安卓IDE筆記
- 【安卓筆記】ormlite入門安卓筆記ORM
- 翻譯 - ASP.NET Core 託管和部署 - 在 Linux 上使用 Nginx 託管 ASP.NET Core 網站ASP.NETLinuxNginx網站
- .NET 6學習筆記(3)——在Windows Service中託管ASP.NET Core並指定埠筆記WindowsASP.NET
- 博森量化軟體:託管錢包與非託管錢包的區別?
- 託管堆和垃圾回收(GC)GC
- 搭建自己的harbor(docker託管)Docker
- 開源託管站點大全
- 【安卓筆記】RecyclerView+SwipeRefreshLayout示例安卓筆記View
- 【安卓筆記】gradle入門安卓筆記Gradle
- 【安卓筆記】下拉重新整理元件的使用及實現安卓筆記元件
- Git 託管平臺新增專案Git
- 如何在 ? Space 上託管 Unity 遊戲Unity遊戲
- 你需要託管資料庫嗎?資料庫
- 伺服器託管大寬頻伺服器
- 安卓開發筆記——數獨遊戲安卓筆記遊戲
- 安卓學習筆記之Activity(一)安卓筆記
- 【安卓筆記】崩潰日誌收集安卓筆記
- Kubernetes學習筆記(二):部署託管的Pod -- 存活探針、ReplicationController、ReplicaSet、DaemonSet、Job、CronJob筆記Controller