Расширение AlertDialogs в Android (где найти примеры, как получить заголовок и кнопки) - PullRequest
3 голосов
/ 19 октября 2011

Я много искал примеров того, как правильно расширять AlertDialogs и получать ожидаемое поведение, но я вряд ли смогу их найти.

Документы на Google тоже мало что говорят.

Да, я знаю, что могу использовать AlertDialog.Builder для создания большинства общих объектов, но по некоторым причинам я хочу создать свои собственные AlertDialogs (у меня есть код, который я хочу содержать в отдельных файлах java по одной причине).

Я создал свой PausDialog.java (см. Код ниже), он появляется, но я не могу получить title или любую из кнопок (положительный, отрицательный и т. Д.) показать в диалоге. Посмотри эту картинку:

No buttons and no title in the PausDialog

Итак, вопрос 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>

Ответы [ 3 ]

10 голосов
/ 02 февраля 2018

Существует несколько вариантов создания пользовательских AlertDialog. Я просто хотел бы дать вам ответ на текущий вопрос. Вы можете установить заголовок, сообщение и другие компоненты AlertDialog в методе onCreate(). Но убедитесь, что вы делаете это, прежде чем позвонить super.onCreate() Пример:

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);
            }
}
4 голосов
/ 19 февраля 2016

Я успешно создал свой собственный 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 (), например, кнопку назад или что-то еще.В противном случае у вас будут утечки памяти из этого диалога.

1 голос
/ 05 марта 2012

Я получил свой собственный 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();
...