Проблема с диалоговым окном оповещения с двумя кнопками «Отмена» и «Открыть действие ссылки»

Я использую класс Alert, в котором я определяю все диалоговые окна предупреждений для отображения пользователю сообщения о состоянии. Это потому, что им удобнее управлять.

Типичный диалог, определенный в этом классе:

public static void DataCleared(Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.data_cleared_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    DialogListner listner = new DialogListner();
    builder.setMessage(R.string.data_cleared_text);
    builder.setPositiveButton("ok", listner);

    AlertDialog diag = builder.create();
    diag.show();
}

В этом диалоговом окне есть кнопка «ОК», которая при нажатии закрывает диалоговое окно.

Я показываю эти диалоги в любом действии, просто вызывая

Alerts.DataCleared(MyActivity.this)

Теперь таким же образом я хочу создать диалоговое окно с двумя кнопками: кнопкой Отмена, чтобы закрыть диалоговое окно, и кнопкой Market, чтобы открыть ссылку на другое приложение Google Play.

я пытался

public static void TryThisApp(Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.my_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    builder.setMessage(R.string.my_text)
       .setCancelable(false)
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               Intent marketIntent = new Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=com.myapp.sample"
                                + getPackageName()));
                startActivity(marketIntent);
           }
       })
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
    AlertDialog diag = builder.create();
    diag.show();
}

Но не работает, выдает различные ошибки компиляции "Невозможно сделать статическую ссылку на нестатический метод..."

getPackageName() и startActivity(marketIntent); подчеркнуты красным Eclipse, с этим сообщением

Как я могу решить эту проблему? Как я могу создать диалог с открытой ссылкой и кнопкой отмены?


person AndreaF    schedule 21.10.2012    source источник
comment
на какую строку указывает ваша ошибка компиляции? возможно, добавьте комментарий к приведенному выше коду с этой информацией?   -  person mfrankli    schedule 21.10.2012
comment
получитьИмяПакета())); и startActivity(marketIntent); подчеркнуты красным с сообщением Невозможно сделать статическую ссылку на нестатический метод...   -  person AndreaF    schedule 21.10.2012


Ответы (2)


1) Вы должны вызывать getPackageName() и startActivity() в контексте, потому что это методы экземпляра,

2) Если вы хотите сделать это из другого класса, необходимо объявить Context con окончательным, поскольку политики безопасности не позволяют ссылаться на переменную non final внутри внутреннего класса, определенного в другом методе.

3) (не обязательно) нужно инвертировать кнопки, обычно Отмена слева и Подтвердить справа

Это правильный код:

public static void TryThisApp(final Context con) {
    AlertDialog.Builder builder = new AlertDialog.Builder(con);
    builder.setTitle(R.string.my_title);
    builder.setIcon(android.R.drawable.ic_dialog_info);
    builder.setMessage(R.string.my_text)
       .setCancelable(false)
       .setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
 dialog.cancel();

           }
       })
       .setNegativeButton("Market", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               Intent marketIntent = new Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=com.myapp.sample"
                                + con.getPackageName()));
                con.startActivity(marketIntent);
           }
       });
    AlertDialog diag = builder.create();
    diag.show();
}
person Silverstorm    schedule 21.10.2012

Ошибка времени компиляции здесь заключается в том, что getPackageName() and startActivity() оба являются методами экземпляра (из контекста). Вы хотите вызывать con.getPackageName() (т. е. ваш аргумент Context) и con.startActivity().

person mfrankli    schedule 21.10.2012
comment
получить другую ошибку не может ссылаться на не конечную переменную внутри внутреннего класса, определенного в другом методе - person AndreaF; 21.10.2012
comment
звучит так, как будто вы хотите определить другой объект Context с модификатором final и инициализировать его, чтобы он указывал на con - person mfrankli; 21.10.2012
comment
вам нужно просто добавить окончательный атрибут в переданный контекст. Ниже я разместил все решение. - person Silverstorm; 21.10.2012