Довільний діалог в 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 результат диалога с пользователем?
Ви повинні увійти під своїм аккаунтом щоб залишати коментарі