五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Android中使用DialogFragment 創(chuàng)建對(duì)話框

Android中使用DialogFragment 創(chuàng)建對(duì)話框

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):372    更新時(shí)間:2017-11-29 11:29   參與評(píng)論
1、 概述

DialogFragment在android 3.0時(shí)被引入。是一種特殊的Fragment,用于在Activity的內(nèi)容之上展示一個(gè)模態(tài)的對(duì)話框。典型的用于:展示警告框,輸入框,確認(rèn)框等等。
在DialogFragment產(chǎn)生之前,我們創(chuàng)建對(duì)話框:一般采用AlertDialog和Dialog。注:官方不推薦直接使用Dialog創(chuàng)建對(duì)話框。
2、 好處與用法

使用DialogFragment來(lái)管理對(duì)話框,當(dāng)旋轉(zhuǎn)屏幕和按下后退鍵時(shí)可以更好的管理其聲明周期,它和Fragment有著基本一致的聲明周期。且DialogFragment也允許開發(fā)者把Dialog作為內(nèi)嵌的組件進(jìn)行重用,類似Fragment(可以在大屏幕和小屏幕顯示出不同的效果)。上面會(huì)通過(guò)例子展示這些好處~
使用DialogFragment至少需要實(shí)現(xiàn)onCreateView或者onCreateDIalog方法。onCreateView即使用定義的xml布局文件展示Dialog。onCreateDialog即利用AlertDialog或者Dialog創(chuàng)建出Dialog。
3、 重寫onCreateView創(chuàng)建Dialog

a)布局文件,我們創(chuàng)建一個(gè)設(shè)置名稱的布局文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 
 
    <TextView 
        android:id="@+id/id_label_your_name" 
        android:layout_width="wrap_content" 
        android:layout_height="32dp" 
        android:gravity="center_vertical" 
        android:text="Your name:" /> 
 
    <EditText 
        android:id="@+id/id_txt_your_name" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/id_label_your_name" 
        android:imeOptions="actionDone" 
        android:inputType="text" /> 
 
    <Button 
        android:id="@+id/id_sure_edit_name" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentRight="true" 
        android:layout_below="@id/id_txt_your_name" 
        android:text="ok" /> 
 
</RelativeLayout> 


b)繼承DialogFragment,重寫onCreateView方法

package com.example.zhy_dialogfragment; 
 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
 
public class EditNameDialogFragment extends DialogFragment 

 
 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    { 
        View view = inflater.inflate(R.layout.fragment_edit_name, container); 
        return view; 
    } 
 


c)測(cè)試運(yùn)行:
Main方法中調(diào)用:

public void showEditDialog(View view) 
    { 
        EditNameDialogFragment editNameDialog = new EditNameDialogFragment(); 
        editNameDialog.show(getFragmentManager(), "EditNameDialog"); 
    }  

效果圖:

 

 



可以看到,對(duì)話框成功創(chuàng)建并顯示出來(lái),不過(guò)默認(rèn)對(duì)話框有個(gè)討厭的標(biāo)題,我們?cè)趺慈サ裟兀嚎梢栽趏nCreateView中調(diào)用getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);即可去掉。即:

public class EditNameDialogFragment extends DialogFragment 

 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) 
    { 
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 
        View view = inflater.inflate(R.layout.fragment_edit_name, container); 
        return view; 
    } 
 
}  


效果圖:
很完美的去掉了討厭的標(biāo)題。

4、 重寫onCreateDialog創(chuàng)建Dialog

在onCreateDialog中一般可以使用AlertDialog或者Dialog創(chuàng)建對(duì)話框,不過(guò)既然google不推薦直接使用Dialog,我們就使用AlertDialog來(lái)創(chuàng)建一個(gè)登錄的對(duì)話框。
a)布局文件

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 
 
    <ImageView 
        android:layout_width="match_parent" 
        android:layout_height="64dp" 
        android:background="#FFFFBB33" 
        android:contentDescription="@string/app_name" 
        android:scaleType="center" 
        android:src="@drawable/title" /> 
 
    <EditText 
        android:id="@+id/id_txt_username" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="4dp" 
        android:layout_marginLeft="4dp" 
        android:layout_marginRight="4dp" 
        android:layout_marginTop="16dp" 
        android:hint="input username" 
        android:inputType="textEmailAddress" /> 
 
    <EditText 
        android:id="@+id/id_txt_password" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="16dp" 
        android:layout_marginLeft="4dp" 
        android:layout_marginRight="4dp" 
        android:layout_marginTop="4dp" 
        android:fontFamily="sans-serif" 
        android:hint="input password" 
        android:inputType="textPassword" /> 
 
</LinearLayout> 


b)繼承DialogFragment重寫onCreateDialog方法

package com.example.zhy_dialogfragment; 
 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
 
public class LoginDialogFragment extends DialogFragment 

 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
        // Get the layout inflater 
        LayoutInflater inflater = getActivity().getLayoutInflater(); 
        View view = inflater.inflate(R.layout.fragment_login_dialog, null); 
        // Inflate and set the layout for the dialog 
        // Pass null as the parent view because its going in the dialog layout 
        builder.setView(view) 
                // Add action buttons 
                .setPositiveButton("Sign in", 
                        new DialogInterface.OnClickListener() 
                        { 
                            @Override 
                            public void onClick(DialogInterface dialog, int id) 
                            { 
                            } 
                        }).setNegativeButton("Cancel", null); 
        return builder.create(); 
    } 


c)調(diào)用

public void showLoginDialog(View view) 
    { 
        LoginDialogFragment dialog = new LoginDialogFragment(); 
        dialog.show(getFragmentManager(), "loginDialog"); 
    } 

效果圖:

 

 

可以看到通過(guò)重寫onCreateDialog同樣可以實(shí)現(xiàn)創(chuàng)建對(duì)話框,效果還是很nice的。

5、傳遞數(shù)據(jù)給Activity

從dialog傳遞數(shù)據(jù)給Activity,可以使用“fragment interface pattern”的方式,下面通過(guò)一個(gè)改造上面的登錄框來(lái)展示這種模式。
改動(dòng)比較小,直接貼代碼了:

package com.example.zhy_dialogfragment; 
 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
 
public class LoginDialogFragment extends DialogFragment 

    private EditText mUsername; 
    private EditText mPassword; 
 
    public interface LoginInputListener 
    { 
        void onLoginInputComplete(String username, String password); 
    } 
     
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
        // Get the layout inflater 
        LayoutInflater inflater = getActivity().getLayoutInflater(); 
        View view = inflater.inflate(R.layout.fragment_login_dialog, null); 
        mUsername = (EditText) view.findViewById(R.id.id_txt_username); 
        mPassword = (EditText) view.findViewById(R.id.id_txt_password); 
        // Inflate and set the layout for the dialog 
        // Pass null as the parent view because its going in the dialog layout 
        builder.setView(view) 
                // Add action buttons 
                .setPositiveButton("Sign in", 
                        new DialogInterface.OnClickListener() 
                        { 
                            @Override 
                            public void onClick(DialogInterface dialog, int id) 
                            { 
                                LoginInputListener listener = (LoginInputListener) getActivity(); 
                                listener.onLoginInputComplete(mUsername 
                                        .getText().toString(), mPassword 
                                        .getText().toString()); 
                            } 
                        }).setNegativeButton("Cancel", null); 
        return builder.create(); 
    } 


拿到username和password的引用,在點(diǎn)擊登錄的時(shí)候,把a(bǔ)ctivity強(qiáng)轉(zhuǎn)為我們自定義的接口:LoginInputListener,然后將用戶輸入的數(shù)據(jù)返回。
MainActivity中需要實(shí)現(xiàn)我們的接口LoginInputListener,實(shí)現(xiàn)我們的方法,就可以實(shí)現(xiàn)當(dāng)用戶點(diǎn)擊登陸時(shí),獲得我們的帳號(hào)密碼了:

c)  MainActivity 

package com.example.zhy_dialogfragment; 
 
import com.example.zhy_dialogfragment.LoginDialogFragment.LoginInputListener; 
 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Toast; 
 
public class MainActivity extends Activity implements LoginInputListener 

 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    } 
 
     
 
    public void showLoginDialog(View view) 
    { 
        LoginDialogFragment dialog = new LoginDialogFragment(); 
        dialog.show(getFragmentManager(), "loginDialog"); 
 
    } 
 
    @Override 
    public void onLoginInputComplete(String username, String password) 
    { 
        Toast.makeText(this, "帳號(hào):" + username + ",  密碼 :" + password, 
                Toast.LENGTH_SHORT).show(); 
    } 
 


效果:

 



6、DialogFragment做屏幕適配

我們希望,一個(gè)對(duì)話框在大屏幕上以對(duì)話框的形式展示,而小屏幕上則直接嵌入當(dāng)前的Actvity中。這種效果的對(duì)話框,只能通過(guò)重寫onCreateView實(shí)現(xiàn)。下面我們利用上面的EditNameDialogFragment來(lái)顯示。
EditNameDialogFragment我們已經(jīng)編寫好了,直接在MainActivity中寫調(diào)用

public void showDialogInDifferentScreen(View view) 
    { 
        FragmentManager fragmentManager = getFragmentManager(); 
        EditNameDialogFragment newFragment = new EditNameDialogFragment(); 
 
        boolean mIsLargeLayout = getResources().getBoolean(R.bool.large_layout) ; 
        Log.e("TAG", mIsLargeLayout+""); 
        if (mIsLargeLayout ) 
        { 
            // The device is using a large layout, so show the fragment as a 
            // dialog 
            newFragment.show(fragmentManager, "dialog"); 
        } else 
        { 
            // The device is smaller, so show the fragment fullscreen 
            FragmentTransaction transaction = fragmentManager 
                    .beginTransaction(); 
            // For a little polish, specify a transition animation 
            transaction 
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
            // To make it fullscreen, use the 'content' root view as the 
            // container 
            // for the fragment, which is always the root view for the activity 
            transaction.replace(R.id.id_ly, newFragment) 
                    .commit(); 
        } 
    } 


可以看到,我們通過(guò)讀取R.bool.large_layout,然后根據(jù)得到的布爾值,如果是大屏幕則直接以對(duì)話框顯示,如果是小屏幕則嵌入我們的Activity布局中
這個(gè)R.bool.large_layout是我們定義的資源文件:
在默認(rèn)的values下新建一個(gè)bools.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 
    <bool name="large_layout">false</bool> 
 
</resources> 


然后在res下新建一個(gè)values-large,在values-large下再新建一個(gè)bools.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
 
    <bool name="large_layout">true</bool> 
 
</resources> 


最后測(cè)試:

 

          

左邊為模擬器,右邊為我的手機(jī)~~~~~
 

7、屏幕旋轉(zhuǎn)

當(dāng)用戶輸入帳號(hào)密碼時(shí),忽然旋轉(zhuǎn)了一下屏幕,帳號(hào)密碼不見了~~~是不是會(huì)抓狂

傳統(tǒng)的new AlertDialog在屏幕旋轉(zhuǎn)時(shí),第一不會(huì)保存用戶輸入的值,第二還會(huì)報(bào)異常,因?yàn)锳ctivity銷毀前不允許對(duì)話框未關(guān)閉。而通過(guò)DialogFragment實(shí)現(xiàn)的對(duì)話框則可以完全不必考慮旋轉(zhuǎn)的問題。

我們直接把上面登錄使用AlertDialog創(chuàng)建的登錄框,拷貝到MainActivity中直接調(diào)用:

public void showLoginDialogWithoutFragment(View view) 
    { 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        // Get the layout inflater 
        LayoutInflater inflater = this.getLayoutInflater(); 
 
        // Inflate and set the layout for the dialog 
        // Pass null as the parent view because its going in the dialog layout 
        builder.setView(inflater.inflate(R.layout.fragment_login_dialog, null)) 
                // Add action buttons 
                .setPositiveButton("Sign in", 
                        new DialogInterface.OnClickListener() 
                        { 
                            @Override 
                            public void onClick(DialogInterface dialog, int id) 
                            { 
                                // sign in the user ... 
                            } 
                        }).setNegativeButton("Cancel", null).show(); 
    } 

下面我分別點(diǎn)擊兩種方式創(chuàng)建的登錄框,看效果圖:

 

可以看到,傳統(tǒng)的Dialog旋轉(zhuǎn)屏幕時(shí)就消失了,且后臺(tái)log會(huì)報(bào)異常~~~使用DialogFragment則不受影響。

 

 

好了,關(guān)于DialogFragment的介紹結(jié)束~~~~

 

有任何疑問請(qǐng)留言

 

源碼點(diǎn)擊下載

 

參考文檔:

http://developer.android.com/guide/topics/ui/dialogs.html#DialogFragment

https://github.com/thecodepath/android_guides/wiki/Using-DialogFragment


如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (372人查看,0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)