Android-диалог с изменяемым заголовком одной строки - PullRequest
1 голос
/ 12 июня 2011

Короче говоря, я работаю над «DurationPickerDialog», который работает аналогично тому, как работает DatePickerDialog, но работает на основе типа xsd: duration , поэтому пользователь указывает количество лет, месяцев, дни и т. д.

Я также реализовал функцию «нечеткой длительности», которая дает мне длительности в виде строки типа «один месяц назад». Я действительно хотел бы иметь возможность обновить заголовок DurationPickerDialog таким же образом, как обновляется заголовок DatePickerDialog, но, похоже, есть проблема. В DatePickerDialog они все время устанавливаются в одну строку, чтобы он не становился «скачкообразным». Вот как источник Android делает заголовок DatePickerDialog.

// Note: before the skim-readers look at this bit, realize that this is NOT my
// code but Android's internal code for the DatePickerDialog.
@Override
public void show() {
    super.show();

    /* Sometimes the full month is displayed causing the title
     * to be very long, in those cases ensure it doesn't wrap to
     * 2 lines (as that looks jumpy) and ensure we ellipsize the end.
     */
    TextView title = (TextView) findViewById(R.id.alertTitle);
    title.setSingleLine();
    title.setEllipsize(TruncateAt.END);
}

К сожалению, я не могу получить доступ к их R.id.alertTitle, потому что это часть com.android.internal.R.

Я видел такие реализации, как в этом сообщении , описывающем стекопоток, где я мог бы изменить атрибут Window.FEATURE_CUSTOM_TITLE, но это, похоже, не позволяет мне легко изменять заголовок после этого.

Была также еще одна публикация stackoverflow , в которой упоминалось, как изменить заголовок во время выполнения между двумя разными XML-макетами, но это также не кажется слишком полезным, так как заголовок должен быть изменяются каждый раз при изменении продолжительности, и создание макета XML для каждой продолжительности, очевидно, не очень хорошая идея.

Итак, поскольку они "обманули", получив доступ к ценности, к которой у нас, простых смертных, нет доступа, есть ли другой способ, которым я мог бы это сделать?

<Ч />

Редактировать: И из-за какой-то чёрной магии кажется, что теперь делает эллиптическим текстом, как я и хотел? Только раньше этого не было, и теперь я не могу воспроизвести проблему. Итак, я полагаю, пока мы здесь, кто-нибудь может объяснить мне, как я мог совершить эту магию?

Ответы [ 2 ]

0 голосов
/ 01 августа 2013

Если вы хотите изменить TextView заголовка диалога (изменить текст, стиль, поведение ...) без использования пользовательского представления, просто сделайте это так:

TextView tv = (TextView) dialog.findViewById(android.R.id.title);
tv.setText("New title");
...
0 голосов
/ 13 июня 2011

Я бы реализовал пользовательский диалог, расширив класс Dialog и создав для него пользовательский макет xml.
Вам понадобятся несколько пользовательских фонов кнопок для комбинаций «плюс / минус» и «верх / низ» и несколько слушателей кнопок для манипулирования значениями.
Поскольку вы выбираете значение длительности, вам, вероятно, понадобится больше места, чем в любом случае дает существующее диалоговое окно.
Таким образом, вы можете установить название на то, что вам нравится. Дайте мне знать, если вам нужен пример кода.

Пример: Класс диалога:

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class DurationDialog extends Dialog {

    private Button yearButtonPlus;
    private Button yearButtonMinus;
    private TextView dialogBody;
    private TextView dialogTitle;

    private String dialogBodyString;
    private String dialogTitleString;


    public DurationDialog(final Context context, String dialogBody, String dialogTitle) {
        super(context,R.style.CustomDialogTheme);
        this.dialogBodyString = dialogBody;
        this.dialogTitleString = dialogTitle;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setContentView(R.layout.my_dialog);

        yearButtonPlus = (Button) findViewById(R.id.dialog_year_button_plus);
        yearButtonMinus = (Button) findViewById(R.id.dialog_year_button_minus);
        dialogBody = (TextView) findViewById(R.id.dialog_body);
        dialogTitle = (TextView) findViewById(R.id.dialog_title);

        dialogBody.setText(dialogBodyString);
        dialogTitle.setText(dialogTitleString);


        yearButtonPlus.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //do year increment here
            }
        });

        //etc...
    }

}

В своей деятельности вы вызываете this.showDialog(DURATION_DIALOG); // DURATION_DIALOG - это просто целое число, указанное в верхней части вашей Деятельности, чтобы идентифицировать диалог для следующей части кода, которая обрабатывает фактическое создание диалога:

import android.app.Activity;
import android.app.Dialog;

public class MyActivity extends Activity  {

    private Dialog dialog;


    //Lots of other activity stuff...



    protected Dialog onCreateDialog(int id) {

        switch (id) {
            case DURATION_DIALOG:
                dialog = new DurationDialog(Activity.this, "your title", "your body");
                dialog.setOnDismissListener(onDismissListener);
                break;
            default:
                dialog = null;
        }
        return dialog;
    }

}

//put this listener in as an inner class of MyActivity:
    private DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {

        DurationDialog dialog = (DurationDialog) dialog;
        //grab the duration stuff out of your dialog and do stuff with it....

    }
};

Наконец, вы можете установить тему диалога, как описано выше в вашем файле styles.xml. Например:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@drawable/bgnd_transparent</item>
        <item name="android:windowIsFloating">true</item>
    </style>
</resources>

Удачи!

...