DailogFragment 使用

對(duì)話框能引起用戶的注意,也可以接收用戶的輸入。我們?yōu)閼?yīng)用添加對(duì)話框,可以修改日期。如圖:

對(duì)話框

圖中的對(duì)話框是 AlertDialog 類的一個(gè)實(shí)例。AlertDialog 類是常用的多用途 Dialog 子類。
學(xué)習(xí)了 AlertDialog,在此總結(jié)一下,同時(shí)也包括 fragment 間數(shù)據(jù)傳輸?shù)膯?wèn)題。

  • 創(chuàng)建 DailogFragment
  • 顯示 DialogFragment
  • 設(shè)置對(duì)話框顯示內(nèi)容
  • fragment 間數(shù)據(jù)的傳遞

創(chuàng)建 DailogFragment

一般是建議將 AlertDialog 封裝在DialogFragment (Fragment 的子類)實(shí)例中使用,這樣可以使用 FragementManager 管理對(duì)話框,可以更加靈活的顯示對(duì)話框。當(dāng)然,不使用 DialogFragment 也可以顯示 AlertDialog 視圖。
另外,如果旋轉(zhuǎn)設(shè)備, AlertDialog 會(huì)消失,而封裝在 fragment 中的 AlertDialog 則不會(huì)出現(xiàn)此問(wèn)題。

要顯示對(duì)話框,首先完成以下任務(wù):

  • 創(chuàng)建名為 DatePickerFragment 的 DialogFragment 子類
  • 創(chuàng)建 AlertDialog
  • 借助 FragmentManager 在屏幕上顯示對(duì)話框。

先為對(duì)話框添加資源

value/strings.xml

<string name="date_picker_title">Date of crime:</string>

創(chuàng)建 DialogFragment,選擇 AppCompat 的版本是 android.support.v7.app.AlertDialog

DatePickerFragment.java

public class DatePickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.date_picker_title)
                .setPositiveButton(android.R.string.ok,null)
                .create();
    } 
}

在以上代碼中,以流接口的形式創(chuàng)建了 AlertDialog 實(shí)例。首先,將 Context 參數(shù)傳入 AlertDialog.Builder 類的方法中,返回一個(gè) AlertDialog.Builder 實(shí)例。然后調(diào)用 AlertDialog.setTitle(...) 和 AlertDialog.setPositiveButton(int, DialogInterface.OnclickLister),setPositiveButton(...) 傳入的兩個(gè)參數(shù)分別是字符串資源和 DialogInterface.OnclickLister 接口的對(duì)象。代碼中傳入的資源 ID 是 Android 的 OK 常量;至于監(jiān)聽器等會(huì)兒實(shí)現(xiàn),先傳入 null。最后調(diào)用 AlertDialog.creat() 返回配置的 AlertDialog 實(shí)例。
Android 中有3種用于對(duì)話的按鈕:positivi、negative、neutral,代表確定,否定,和中立

顯示 DialogFragment

和其他 fragment 一樣,DialogFragment 實(shí)例也是由托管 activity 的FragmentManager 管理的,要將 DialogFragment 添加給 FragmentManager 管理并放置到屏幕上,可調(diào)用以下兩個(gè)方法:

public void show(FragmentManager, String);
public void show(FragmentTransaction, String);

String 是可唯一識(shí)別 FragmentManager 隊(duì)列中的 DialogFragment。兩個(gè)方法都行,但是 傳入 FragmentTransaction,需要自己負(fù)責(zé)創(chuàng)建事務(wù)并提交;傳入 FragmentManager 參數(shù),系統(tǒng)會(huì)自動(dòng)創(chuàng)建并提交事務(wù)。
這里我們傳入的是 FragmentManager。

CrimeFragment.java

public class CrimeFragment extends Fragment {

private static final String DIALOG_DATE = "DialogDate";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
mDateButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager manager = getFragmentManager();
                DatePickerFragment dialog = new DatePickerFragment();
                dialog.show(manager,DIALOG_DATE);
            }
        });
}

到這里我們運(yùn)行程序,已經(jīng)能看到對(duì)話框了。

設(shè)置對(duì)話框顯示內(nèi)容

接下來(lái),使用 AlertDialog.Build 的 setView(...) 方法,給 AlertDialog 對(duì)話框添加 DatePicker 組件。
先來(lái)設(shè)置 DatePicker 的布局,創(chuàng)建 dialog_date.xml 布局文件。

layout/dialog_date.xml

<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/dialog_date_picker"
    android:calendarViewShown="false">
</DatePicker>

實(shí)例化 DialogPicker 視圖并添加到對(duì)話框。

DatePickerFragment .java

public class DatePickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null);
        return new AlertDialog.Builder(getActivity())
                .setView(view)
                .setTitle(R.string.date_picker_title)
                .setPositiveButton(android.R.string.ok,null)
                .create()
    }
}

現(xiàn)在運(yùn)行程序,就會(huì)出現(xiàn)文章開頭的截圖了,最后再來(lái)看數(shù)據(jù)的傳輸問(wèn)題。

fragment 間數(shù)據(jù)的傳遞

現(xiàn)在需要實(shí)現(xiàn)同一個(gè) activity 托管的兩個(gè) fragment 之間的數(shù)據(jù)傳遞。

CrimeFragment 與 DatePickerFragment 的對(duì)話

首先來(lái)看傳遞數(shù)據(jù)給 DatePickerFragment。要傳遞 crime 日期給 DatePickerFragment,需要將它保存在 DatePickerFragment 的 argument bundle 中。創(chuàng)建和設(shè)置 fragment argument 通常是在 newInstance() 方法中完成。

DatePickerFragment.java

public static final String EXTRA_DATE = "con.bingnerdranch.android.criminalintent.date";

private DatePicker mDatePicker;

public static DatePickerFragment newInstance(Date date){
      Bundle args = new Bundle();
      args.putSerializable(ARG_DATE,date);
      DatePickerFragment fragment = new DatePickerFragment();
      fragment.setArguments(args);
     return  fragment;
}

然后,在 CrimeFragment 中,用 DatePickerFragment.newInstance(Date) 方法替換 DatePickerFragment 的構(gòu)造方法。

CrimeFragment.java

public class CrimeFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    mDateButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager manager = getFragmentManager();
               // DatePickerFragment dialog = new DatePickerFragment();
                DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());
                dialog.setTargetFragment(CrimeFragment.this,REQUEST_DATE);
                dialog.show(manager,DIALOG_DATE);
    }
}

DatePickerDialogFragment 使用的 Date 中的信息來(lái)初始化 DatePicker 對(duì)象。但是 DatePicker 對(duì)象的初始化需要整數(shù)形式的年月日。Date 是時(shí)間戳,無(wú)法直接提供整數(shù),我們還需要?jiǎng)?chuàng)建一個(gè) Calender 對(duì)象,用 Date 對(duì)象配置它,獲得年月日。

DatePickerFragment.java

public class DatePickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Date date = (Date) getArguments().getSerializable(ARG_DATE);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
}

GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 選擇日期可以使用DatePicker控件這是appcompat里的,所以新舊Android系統(tǒng)都可兼容 再把包含這...
    我好菜啊_閱讀 974評(píng)論 0 1
  • 本章主要介紹了如何使用內(nèi)嵌在 fragment 中的對(duì)話框,以及 fragment 之間如何傳遞數(shù)據(jù)GitHub ...
    kniost閱讀 342評(píng)論 0 0
  • 小區(qū)里開了很多家理發(fā)店,每次到該理發(fā)的時(shí)候,小伙伴都特別糾結(jié),因?yàn)槊恳患业昕雌饋?lái)都差不多。 在同質(zhì)化如此普通、競(jìng)爭(zhēng)...
    努力攢錢的二花閱讀 321評(píng)論 0 0
  • 把世間的恩怨情仇叫作“滾滾紅塵”實(shí)在是天大的不幸,因?yàn)檫@無(wú)疑給它增加了一種虛假的悲壯感,甚至自虐式的浪漫感;把它事...
    湖邊祈禱閱讀 353評(píng)論 0 0
  • 不知不覺中已經(jīng)過(guò)了40歲,好像生活的重心直接轉(zhuǎn)到兒子的檔次,為他歡而歡,為他喜而喜,而他不自知。古人云:四十不惑。...
    竹子1閱讀 210評(píng)論 0 0

友情鏈接更多精彩內(nèi)容