Пользовательский диалог в Android

февраля
29
2012
Метки: android dialog

Рассмотрим создание пользовательского диалога на платформе Android. Будут показаны два очень похожих способа создания диалога.

Итак, приступим. Для начала отредактируем файл разметки (в примере этот файл имеет имя mail.xml):


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="CustomDialog" />

    <Button
        android:id="@+id/button_dialog1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dialog (Method 1)" >
    </Button>

    <Button
        android:id="@+id/button_dialog2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dialog (Method 2)" >
    </Button>
</LinearLayout>

Каждая из двух кнопок будут отвечать за свой способ отображения диалога.

Ниже приведены два класса для каждого способа отображения диалога:

CustomDialog1.java

package com.seostella.customdialog;

import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class CustomDialog1 implements OnClickListener{
	private EditText dialogEditBox;
	private TextView dialogInfo;
	private Button dialogButton;
	private Dialog dialog;
	private Activity activity;
	
	public CustomDialog1( Activity activity ){
		this.activity = activity;
		init();
	}
	
	private void init(){
		dialog = new Dialog(activity);
		dialog.setTitle("Custom dialog title");
        dialog.setContentView(R.layout.dialog);		

		dialogEditBox = (EditText) dialog.findViewById( R.id.dialog_edit_box );
		dialogInfo = (TextView) dialog.findViewById( R.id.dialog_info );
		dialogButton = (Button) dialog.findViewById( R.id.dialog_button );
		dialogButton.setOnClickListener( this );
	}
	
	public void show(){
		dialog.show();		
	}

	@Override
	public void onClick(View v) {
		dialogInfo.setText( dialogEditBox.getText() );
	}
}

CustomDialog2.java

package com.seostella.customdialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class CustomDialog2 implements OnClickListener {
	private EditText dialogEditBox;
	private TextView dialogInfo;
	private Button dialogButton;
	private Dialog dialog;
	private Activity activity;
	
	public CustomDialog2( Activity activity ){
		this.activity = activity;
		init();
	}
	
	private void init(){
		LayoutInflater inflater = LayoutInflater.from( this.activity );
		View layout = inflater.inflate(R.layout.dialog, null);
		
		dialogEditBox = (EditText) layout.findViewById( R.id.dialog_edit_box );
		dialogInfo = (TextView) layout.findViewById( R.id.dialog_info );
		dialogButton = (Button) layout.findViewById( R.id.dialog_button );
		dialogButton.setOnClickListener( this );

		AlertDialog.Builder builder = new AlertDialog.Builder( this.activity );
		builder.setView(layout);

		dialog = builder.create(); 
		dialog.setTitle("Custom dialog title");
	}
	
	public void show(){
		dialog.show();		
	}

	@Override
	public void onClick(View v) {
		dialogInfo.setText( dialogEditBox.getText() );
	}
}

Различия этих двух классов в методе init(). В первом случае диалог создается с использованием конструктора Dialog():


dialog = new Dialog(activity);

А разметка присваивается с помощью метода setContentView() класса Dialog:


dialog.setContentView(R.layout.dialog);		

Во втором случае диалог создается с использованием класса AlertDialog.Builder():


AlertDialog.Builder builder = new AlertDialog.Builder( this.activity );
//...
dialog = builder.create(); 

А разметка создается отдельно с помощью LayoutInflater:


LayoutInflater inflater = LayoutInflater.from( this.activity );
View layout = inflater.inflate(R.layout.dialog, null);

И присваивается объекту builder, ответственному за создания диалога:


builder.setView(layout);

В обеих способах используется одна и та же разметка для диалога (файл /res/layout/dialog.xml):


<?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"
    android:layout_gravity="center" >
    
    <EditText
        android:id="@+id/dialog_edit_box" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Enter text..." />
    
    <TextView
        android:id="@+id/dialog_info"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="..." />
    
    <Button
        android:id="@+id/dialog_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="Click me!" />

</LinearLayout>

Класс Activity:


package com.seostella.customdialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class CustomDialogActivity extends Activity {
	private CustomDialog1 customDialog1;
	private CustomDialog2 customDialog2;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		customDialog1 = new CustomDialog1( this );
		
		Button buttonDialog1 = (Button) findViewById(R.id.button_dialog1);
		buttonDialog1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				customDialog1.show();
			}
		});
		
		customDialog2 = new CustomDialog2(this);
		Button buttonDialog2 = (Button) findViewById(R.id.button_dialog2);
		buttonDialog2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				customDialog2.show();
			}
		});
	}
}

При нажатии на первую кнопку отображается следующий диалог:

Пользовательский диалог в Android. Способ 1

При нажатии на вторую кнопку отображается следующий диалог:

Пользовательский диалог в Android. Способ 2

Комментарии (2)

krapotkin
31 августа 2012 г. 10:43
А как же получить в вызывающей Activity результат диалога с пользователем?
krapotkin
31 августа 2012 г. 10:43
А как же получить в вызывающей Activity результат диалога с пользователем?
Вы должны войти под своим аккаунтом чтобы оставлять комментарии