Android 对话框Dialog

本文介绍了一种在Android应用中创建自定义对话框的方法,利用DialogFragment替代过时的showDialog方式,通过onCreateDialog(Bundle)自定义对话框布局及交互逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在4.2后就不推荐使用showDialog了,而是推荐使用DialogFragment;


关于DialogFragment 谷歌是这样描述的:

you may implement onCreateDialog(Bundle) to create your own custom Dialog object.

你可以自己通过onCreateDialog(Bundle)来创建一个自定义的Dialog

下面是自己实现的一个Dialog:

首先是效果图

布局文件dialog_signin.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" xmlns:android1="http://schemas.android.com/apk/res/android">

    <ImageView
        android:src="@drawable/ic_launcher"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:scaleType="center"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name" />
    <EditText
        android:id="@+id/username"
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="4dp"
        android:hint="user" />
    <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:fontFamily="sans-serif"
        android:hint="password"/>

    <CheckBox
        android1:id="@+id/checkBox1"
        android1:layout_width="wrap_content"
        android1:layout_height="wrap_content"
        android1:text="CheckBox" />

</LinearLayout>
 
这里本来想添加一个SeekBar进去 结果发现不行.不知道什么原因.有明白的大神可以告诉一下~

自定义的Dialog类 CustomDialog.java

package com.example.customdialog;

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.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;

public class CustomDialog extends DialogFragment implements
		OnCheckedChangeListener {
	private CheckBox box;
	private int arg;

	//通过newInstance()创建实例,通过缺省构造函数创建对象,将传递的信息作为Fragment的参数,返回对象
	public static CustomDialog newInstance(String title) {
		CustomDialog frag = new CustomDialog();
		Bundle args = new Bundle();
		args.putString("title", title);
		frag.setArguments(args);
		return frag;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		String title = getArguments().getString("title");
		//生成inflater
		LayoutInflater inflater = getActivity().getLayoutInflater();
		// 通过inflate将自定义的Dialog布局找到
		View view = inflater.inflate(R.layout.dialog_signin, null);
		//注意Dialog布局里的组件不能用getActivity().findViewBtId(xxx),否则会报错
		//如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件.
		box = (CheckBox)view.findViewById(R.id.checkBox1);
		box.setOnCheckedChangeListener(this);
		return new AlertDialog.Builder(getActivity())
				.setView(view)
				.setPositiveButton("ok", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						((MainActivity) getActivity()).doPositiveClick();
					}
				})
				.setNegativeButton("cancel",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int whichButton) {
								((MainActivity) getActivity())
										.doNegativeClick();
							}
						}).create();
	}

	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
		// TODO Auto-generated method stub
		int key = buttonView.getId();
		switch (key) {
		case R.id.checkBox1:
			if (isChecked) {
				Toast.makeText(getActivity(), "check true", Toast.LENGTH_SHORT)
						.show();
			} else {
				Toast.makeText(getActivity(), "check false", Toast.LENGTH_SHORT)
						.show();
			}
			break;

		default:
			break;
		}
	}
}


最后是Activity MainActivity.java

package com.example.customdialog;

import android.os.Bundle;
import android.app.Activity;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private FragmentManager fragmentManager;
	private FragmentTransaction fragmentTransaction;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		fragmentManager = getFragmentManager();
		fragmentTransaction = fragmentManager.beginTransaction();

		button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				showDialog();

			}
		});
	}

	void showDialog() {
		DialogFragment customDialog = CustomDialog.newInstance("demo");
		customDialog.show(fragmentManager, "dialog");
	}
	
	public void doPositiveClick() {
	    // Do stuff here.
	    Log.i("Dialog", "Positive click!");
	}

	public void doNegativeClick() {
	    // Do stuff here.
	    Log.i("Dialog", "Negative click!");
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值