Могу ли я создавать собственные глобальные методы в своем классе приложений Android? - PullRequest
4 голосов
/ 17 августа 2010

В настоящее время у меня есть приложение, которое выполняет множество операций и должно иметь возможность поддерживать состояние между этими действиями.

Для этого я использую класс Application, объявляя свои глобальные переменные и используя геттеры и сеттеры для взаимодействия с моими действиями.

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

EscarApplication application = (EscarApplication) this.getApplication();

EscarApplication - имя класса моего приложения выше.

Я пытался включить этот метод в мой класс приложения:

public void showError(String title, String message) {
        Log.i("Application level",message);
        this.alertDialog.setTitle(title);
        alertDialog.setMessage(message);
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                return;
            }
        });
        alertDialog.show();
    }

В надежде, что я смогу вызвать этот метод из действия без необходимости его переобъявления, но когда я вызываю его, используя что-то вроде ниже, я получаю исключение нулевого указателя:

Visit.this.application.showError("Update error", "An error has occurred while trying to communicate with the server");

Визит - это название моей текущей деятельности выше.

Должно ли это работать, или я могу использовать только методы получения и установки для изменения глобальных переменных в классе приложения.

Трассировка стека:

java.lang.RuntimeException: Unable to start activity ComponentInfo{escar.beedge/escar.beedge.HomeScreen}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.access$2100(ActivityThread.java:116)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4203)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(375): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at escar.beedge.EscarApplication.showError(EscarApplication.java:98)
at escar.beedge.HomeScreen.onCreate(HomeScreen.java:30)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)

Диалог объявлен как таковой в классе приложения:

AlertDialog alertDialog;

Создано в том же классе:

alertDialog = new AlertDialog.Builder(this).create();

и метод для его вызова в этом классе выглядит следующим образом:

public void showError(String title, String message) {
        alertDialog.setTitle(title);
        alertDialog.setMessage(message);
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                return;
            }
        });
        alertDialog.show();
    }

И, наконец, он вызывается из вида деятельности, подобного так:

EscarApplication application;
application = (EscarApplication) this.getApplication();
application.showError("test", "display this message");

Ответы [ 4 ]

1 голос
/ 17 августа 2010

Если вам нужно поддерживать состояние между действиями, то воспользуйтесь услугой.Все остальное взломать

0 голосов
/ 24 сентября 2013

Кто-то исправит меня, если я ошибаюсь, но класс Application не сможет выполнить связанные с представлением объекты, поскольку они должны быть связаны с представлением, которое должно быть связано с действием.

В этом смысле вы можете использовать свой класс Application для реализации статического метода, который настраивает диалог

public static void setDialog(String title, String message,AlertDialog alertDialog){
        alertDialog.setTitle(title);
        alertDialog.setMessage(message);
        alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                return;
            }
        });
}

но вам нужно будет создать диалоговое окно и вызвать метод show для самих действий (на самом деле, может быть, даже кнопку , которую нужно установить в диалоговом окне, нужно будет создать для действия)

Другим вариантом может быть реализация класса, extends класса AlertDialog , для которого кнопка предварительно настроена на желаемое поведение.

0 голосов
/ 18 мая 2011

Я хочу достичь чего-то похожего на вас.

Я не нашел официального ответа, но похоже, что вы не должны использовать контекст приложения для Toast и Dialogs.Вместо этого попробуйте использовать контекст действия следующим образом:

// From inside your activity
Dialog dialog = new Dialog(this);

вместо этого:

// From inside your Application instance
Dialog dialog = new Dialog(getApplicationContext());

Читать это: Android: ProgressDialog.show () падает с getApplicationContext

0 голосов
/ 17 августа 2010

Вы можете использовать шаблон Singleton.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...