Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android DialogFragment對話框

Android DialogFragment對話框

編輯:關於Android編程

寫在前面

從事Android開發至今,一提及Android開發中使用的對話框就想起AlertDialog或者PopupWindow,我在上一篇博客中也總結了這兩種對話框的使用大全,有興趣的可靠look look Android 對話框AlertDialog,PopupWindow使用大全。由於最近在總結Android對話框的使用,就無意在網上看到Android3.0之後出現了一個新的對話框—-DialogFragment。

DialogFragment對話框出現的意義

為什麼android系統有AlertDialog,PopupWindow對話框,基本滿足客戶需求,為啥還要跑出一個DialogFragment對話框呢?這就要從DialogFragment的優點說起了:

有和Fragment基本一致的生命周期,因此便於Activity更好的控制管理DialogFragment。 隨屏幕旋轉(橫豎屏幕切換)DialogFragment對話框隨之自動調整對話框大小。而AlertDialog和PopupWindow隨屏幕切換而消失。 DialogFragment的出現解決 橫豎屏幕切換Dialog消失的問題。

DialogFragment對話框的使用

基礎對話框

這裡寫圖片描述

代碼示例:

package com.xjp.dialogfragment;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;


public class MainActivity extends ActionBarActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void buttonClick(View view) {
        showDialog();
    }

    private void showDialog() {

        /**
         * 為了不重復顯示dialog,在顯示對話框之前移除正在顯示的對話框。
         */
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment fragment = getFragmentManager().findFragmentByTag(basicDialog);
        if (null != fragment) {
            ft.remove(fragment);
        }

        /**
         * 0:默認樣式
         * 1:無標題樣式
         * 2:無邊框樣式
         * 3:不可輸入,不可獲得焦點樣式
         * 可根據參數不同執行測試這幾種樣式的對話框。
         */
        BasicDialogFragment dialogFragment = BasicDialogFragment.newInstace(0);
        dialogFragment.show(ft, basicDialog);
    }
}


//DialogFragment代碼:
package com.xjp.dialogfragment;


import android.app.DialogFragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Description:基礎對話框
 * User: xjp
 * Date: 2015/5/20
 * Time: 8:44
 */

public class BasicDialogFragment extends DialogFragment {

    public static BasicDialogFragment newInstance(int style) {
        BasicDialogFragment dialogFragment = new BasicDialogFragment();

        Bundle bundle = new Bundle();
        bundle.putInt(style, style);
        dialogFragment.setArguments(bundle);
        return dialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int styleNum = getArguments().getInt(style, 0);
        int style = 0;
        switch (styleNum) {
            case 0:
                style = DialogFragment.STYLE_NORMAL;//默認樣式
                break;
            case 1:
                style = DialogFragment.STYLE_NO_TITLE;//無標題樣式
                break;
            case 2:
                style = DialogFragment.STYLE_NO_FRAME;//無邊框樣式
                break;
            case 3:
                style = DialogFragment.STYLE_NO_INPUT;//不可輸入,不可獲得焦點樣式
                break;
        }
        setStyle(style, 0);//設置樣式

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

//        getDialog().setTitle(退出微信);//添加標題
//        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題
        View view = inflater.inflate(R.layout.fragent_basic_dialog, container);

        TextView title = (TextView) view.findViewById(R.id.title);
        title.setText(微信退出);
        TextView message = (TextView) view.findViewById(R.id.message);
        message.setText(是否退出微信,退出微信之後不能受到消息。是否退出微信,退出微信之後不能受到消息。 +
                是否退出微信,退出微信之後不能受到消息。是否退出微信,退出微信之後不能受到消息。 +
                是否退出微信,退出微信之後不能受到消息。);
        view.findViewById(R.id.no).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        view.findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        return view;
    }
}



//布局代碼:



    

    

    


總結:

基礎對話框只需重寫onCreateView方法即可加載對話框。 可根據自己需求調用setStyle(int,int)是否修改對話框樣式,上面代碼中已經實現。值得注意的是:設置setStyle()必須在onCreateView()方法調用之前才有效,因此一般在onCreate()方法中調用onStyle()方法。 取消和設置標題的方法:setStyle(DialogFragment.STYLE_NO_TITLE,0) 和 getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE),設置標題可以getDialog().setTitle(“退出微信”);

AlertDialog對話框的使用

這裡寫圖片描述

package com.xjp.dialogfragment;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity implements AlertDialogFragment.DialogFragmentClickImpl {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showAlertDialog();
            }
        });
    }


    private void showAlertDialog() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment fragment = getFragmentManager().findFragmentByTag(basicDialog);
        if (null != fragment) {
            ft.remove(fragment);
        }

        AlertDialogFragment dialogFragment = new AlertDialogFragment();
        dialogFragment.show(ft, basicDialog);
    }

    @Override
    public void doPositiveClick() {
        showToast(確定按鈕);
    }

    @Override
    public void doNegativeClick() {
        showToast(取消按鈕);
    }

    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

}

//DialogFragment

package com.xjp.dialogfragment;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

/**
 * Description:
 * User: xjp
 * Date: 2015/5/20
 * Time: 11:18
 */

public class AlertDialogFragment extends DialogFragment {


    public interface DialogFragmentClickImpl {
        void doPositiveClick();

        void doNegativeClick();
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.e(TAG, **onCreateDialog**);
        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.ic_launcher)
                .setTitle(退出微信)
                .setMessage(是否退出微信,是否退出微信,是否退出微信,是否退出微信,)
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                DialogFragmentClickImpl impl = (DialogFragmentClickImpl) getActivity();
                                impl.doPositiveClick();
                            }
                        }
                )
                .setNegativeButton(android.R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                DialogFragmentClickImpl impl = (DialogFragmentClickImpl) getActivity();
                                impl.doNegativeClick();
                            }
                        }
                )
                .create();
    }
}

總結:

1.可以在onCreateView中加載對話框,也可以重寫onCreateDialog,當然二者不要同時出現。
2.對話框和Activity之間的通訊可以通過接口的方式實現,如上代碼的DialogFragmentClickImpl接口。
3.onCreateView可以加載客戶化更高的對話框,onCreateDialog加載系統AlertDialog類型對話框比較合適。
4.DialogFragment只是在Fragment中實現了一個Dialog而已。
5.DialogFragmnet對話框橫屏時對話框不會關閉,因為DailogFragment有Fragment屬性,會在屏幕發生變化時重新創建DialogFragment。有圖為證:
這裡寫圖片描述
這裡寫圖片描述

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved