編輯:關於Android編程
從事Android開發至今,一提及Android開發中使用的對話框就想起AlertDialog或者PopupWindow,我在上一篇博客中也總結了這兩種對話框的使用大全,有興趣的可靠look look Android 對話框AlertDialog,PopupWindow使用大全。由於最近在總結Android對話框的使用,就無意在網上看到Android3.0之後出現了一個新的對話框—-DialogFragment。
為什麼android系統有AlertDialog,PopupWindow對話框,基本滿足客戶需求,為啥還要跑出一個DialogFragment對話框呢?這就要從DialogFragment的優點說起了:
有和Fragment基本一致的生命周期,因此便於Activity更好的控制管理DialogFragment。 隨屏幕旋轉(橫豎屏幕切換)DialogFragment對話框隨之自動調整對話框大小。而AlertDialog和PopupWindow隨屏幕切換而消失。 DialogFragment的出現解決 橫豎屏幕切換Dialog消失的問題。
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;
}
}
//布局代碼:
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。有圖為證:
最近我為了准備下一個系列的博客,也是花了很長的時間研讀源碼。很遺憾的是,下一個系列的博客我可能還要再過一段時間才能寫出來,那麼為了不至於讓大家等太久,今天就給大家更新一篇
引言上一篇博客我們學習了Android View 觸摸事件傳遞機制,不了解的同學可以查看Android View 觸摸事件傳遞機制。今天繼續學習Android觸摸事件傳遞
Visual Studio: C++跨平台的移動解決方案Visual Studio (下載地址) 正在迅速成為一個跨平台的C++IDE。我們的目標是讓Visual Stu
對於Android 的手勢不光在軟件中會經常用到,比如浏覽器中的翻頁,滾動頁面等等;當然其實在我