#android #android-alertdialog
#Android #android-alertdialog
Вопрос:
Я много искал примеры того, как правильно расширять AlertDialogs и получать ожидаемое поведение, но я вряд ли могу их найти.
Документы в Google на самом деле тоже мало что говорят.
Да, я знаю, что могу использовать AlertDialog.Конструктор для создания большинства общих вещей, но по некоторым причинам я хочу создать свои собственные AlertDialogs (у меня есть код, который я хочу содержать в отдельных файлах Java по одной причине).
Я создал свой PausDialog.java (см. Код Ниже), он появляется, но я не могу получить заголовок или любую из кнопок (положительную, отрицательную и т. Д.) Для отображения в диалоговом окне. Посмотрите на эту картинку:
Итак, вопрос 1: где я могу найти хорошие, чистые и полезные примеры того, как правильно расширять AlertDialogs и как их использовать в дальнейшем
вопрос 2. почему я не вижу заголовок или какие-либо кнопки, используя пользовательский AlertDialog ниже?
PausDialog.java
package Test;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.SystemClock;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class PausDialog extends AlertDialog
{
protected PausDialog(Context context)
{
super(context, R.style.DialogTheme);
}
@Override
protected void onCreate(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.paus);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.gravity = Gravity.TOP;
final EditText ed1= (EditText) findViewById(R.id.editTextPausArea);
final EditText ed2= (EditText) findViewById(R.id.EditTextPausTimeFrom);
final EditText ed3= (EditText) findViewById(R.id.EditTextPausTimeTo);
TextView tv1 = (TextView)findViewById(R.id.textViewPausArea);
tv1.setText(LanguageHandler.GetString("AREA"));
tv1 = (TextView)findViewById(R.id.textViewPausTime);
tv1.setText(LanguageHandler.GetString("TIME"));
setButton(DialogInterface.BUTTON_POSITIVE, "Positive",
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int fromArea = 0;
int fromTime = 0;
int toTime = 0;
try
{
fromArea = Integer.parseInt(ed1.getText().toString());
fromTime = Integer.parseInt(ed2.getText().toString());
toTime = Integer.parseInt(ed3.getText().toString());
}
catch(Exception e)
{
// TODO fail
}
}
});
setButton(DialogInterface.BUTTON_NEGATIVE, "Negative",
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something
}
});
}
}
MainActivity.java , вызывая PausDialog:
PausDialog pd = new PausDialog(MainActivity.this);
pd.show();
Макет для моего PausDialog, paus.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:weightSum="1">
<RelativeLayout android:gravity="top" android:layout_height="200dp" android:layout_weight="0.11" android:layout_width="304dp">
<TextView android:layout_alignParentLeft="true" android:text="Område" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@ id/textViewPausArea" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="17dp" android:layout_marginTop="18dp"></TextView>
<EditText android:layout_alignBaseline="@ id/textViewPausArea" android:id="@ id/editTextPausArea" android:layout_width="80dp" android:layout_alignBottom="@ id/textViewPausArea" android:inputType="number" android:layout_height="wrap_content" android:layout_toRightOf="@ id/textViewPausArea" android:layout_marginLeft="17dp">
<requestFocus></requestFocus>
</EditText>
<TextView android:text="Tid" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@ id/editTextPausArea" android:id="@ id/textViewPausTime" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:layout_alignLeft="@ id/textViewPausArea"></TextView>
<EditText android:layout_alignBaseline="@ id/textViewPausTime" android:id="@ id/EditTextPausTimeFrom" android:layout_width="80dp" android:layout_alignBottom="@ id/textViewPausTime" android:inputType="time" android:layout_height="wrap_content" android:layout_alignLeft="@ id/editTextPausArea"></EditText>
<TextView android:text=" - " android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@ id/textView3" android:layout_height="wrap_content" android:layout_alignBaseline="@ id/EditTextPausTimeFrom" android:layout_alignBottom="@ id/EditTextPausTimeFrom" android:layout_toRightOf="@ id/EditTextPausTimeFrom"></TextView>
<EditText android:id="@ id/EditTextPausTimeTo" android:layout_width="80dp" android:inputType="time" android:layout_height="wrap_content" android:layout_alignBaseline="@ id/textView3" android:layout_alignBottom="@ id/textView3" android:layout_toRightOf="@ id/textView3"></EditText>
</RelativeLayout>
</LinearLayout>
Комментарии:
1. Если это необходимо? Ну, если вам нужен AlertDialog и у вас есть пользовательский код только для этого диалога, то я бы сказал, что его рекомендуется…
Ответ №1:
Существует несколько вариантов создания пользовательского AlertDialog. Я просто хотел бы дать вам ответ на текущий вопрос. Вы можете установить заголовок, сообщение и другие компоненты AlertDialog в onCreate()
методе. Но убедитесь, что вы делаете это, прежде чем вызывать super.onCreate()
Example:
public class PausDialog extends AlertDialog {
@Override
protected void onCreate(Bundle savedInstanceState) {
View content = LayoutInflater.from(getContext()).inflate(R.layout.dialog_some_view, null);
setView(content);
setTitle("Some Title");
setMessage("Some Message");
setButton(DialogInterface.BUTTON_POSITIVE, "Ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("TAG", "BUTTON_POSITIVE");
}
});
((TextView) content.findViewById(R.id.data)).setText(R.string.some_custom_data);
((TextView) content.findViewById(R.id.description)).setText(getContext().getString(R.string.description));
setCancelable(false);
setOnKeyListener((dialog, keyCode, event) -> keyCode == KeyEvent.KEYCODE_BACK);
super.onCreate(savedInstanceState);
}
}
Ответ №2:
Я успешно создал свой собственный пользовательский AlertDialog
интерфейс, расширив Builder
класс.
public class MyDialog extends AlertDialog.Builder {
private Context mContext;
private AlertDialog mAlertDialog;
public MyDialog(Context context) {
super(context);
mContext = context;
}
@SuppressLint("InflateParams")
@Override
public AlertDialog show() {
View view = LayoutInflater.from(mContext).inflate(R.layout.my_dialog, null);
...
mAlertDialog = super.show();
return mAlertDialog;
}
}
Затем из кода я создаю их экземпляры следующим образом:
MyDialog myDialog = new MyDialog(getActivity());
myDialog.show();
Единственное предостережение заключается в том, что вы должны позаботиться о том, чтобы правильно закрыть диалоговое окно при изменении ориентации или других событиях, которые явно не вызывают метод dismiss(), например, кнопка «Назад» или что-то еще. В противном случае у вас будут утечки памяти из этого диалогового окна.
Ответ №3:
Я заставил свой пользовательский AlertDialog работать, используя что-то похожее на этот код.
Сначала сделайте ваш конструктор общедоступным
public PausDialog(Context context)
Затем вы можете просто создать экземпляр и показать его как так:
PauseDialog newDialog = new PauseDialog(this);
newDialog.setTitle("My Dialog");
newDialog.setButton("OK", ...); // Insert your onClick implementation
newDialog.setButton2("Cancel", ...); // Insert your onClick implementation
newDialog.Show();
Комментарии:
1. проблема с этим подходом заключается в том, что вы не можете использовать AlertDialog. Конструктор для построения вашего диалога.