Розглянемо створення власного діалогу на платформі 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>
Кожна з двох кнопок будуть відповідати за свій спосіб відображення діалогу.
Нижче наведено два класи для кожного способу відображення діалогу:
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() );
}
}
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();
}
});
}
}
При натисканні на першу кнопку відобразиться наступний діалог:
При натисканні на другу кнопку відобразиться наступний діалог:
31 серпня 2012 р. 10:43
|
А как же получить в вызывающей Activity результат диалога с пользователем?
|
31 серпня 2012 р. 10:43
|
А как же получить в вызывающей Activity результат диалога с пользователем?
|