Приложение иногда падает после изменения языкового ресурса - PullRequest
1 голос
/ 03 апреля 2012

Проблема: приложение вылетает с StackOverflowError

ViewRoot.draw(boolean) line: 1374   
ViewRoot.performTraversals() line: 1114 
ViewRoot.handleMessage(Message) line: 1633  
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 

У меня есть TabActivity с некоторыми вкладками.Я добавляю вкладки следующим образом:

intent = new Intent().setClass(this, SigninActivity.class);
spec = tabHost.newTabSpec("Signin").setIndicator("CV", res.getDrawable(R.drawable.ic_tab_signin)).setContent(intent);
tabHost.addTab(spec);

Во вкладке, которая у меня есть, при нажатии я показываю всплывающее окно с двумя кнопками из Закрытие всплывающего окна Android При нажатии на какую-либо кнопку во всплывающем окне, язык меняется следующим образом:

Locale mLocale = new Locale("ar");
Locale.setDefault(mLocale);
Configuration config = getBaseContext().getResources().getConfiguration();
if (!config.locale.equals(mLocale)) {
    config.locale = mLocale;
    getBaseContext().getResources().updateConfiguration(config, null);
    replaceContentView("Signin", new Intent(NewAccActivity.this, NewAccActivity.class));
}

И когда я нажимаю 6-7 раз на одной вкладке, чтобы изменить язык (макет и значения), приложение вылетает с NullPointer по методу (PopupWindow)this.window.dismiss() внеожиданно возникнуть.

Я добавил таймер для вызова dismiss(), но теперь приложение вылетает с StackOverflowError после 6-7 смен языка.

В чем проблема?

Upd: Убираю таймер.На всплывающем экране все кнопки имеют одну OnClickListener.

В действии:

    Button btnDialogShow = (Button) findViewById(R.id.button);
    btnDialogShow.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            dw = new LanguageChangeDialog(v, getBaseContext());
            dw.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Button b = (Button) v;
                    switch (b.getId()) {
                    case R.id.en:
                        cvitchToEn();
                        break;
                    case R.id.ar:
                        cvitchToAr();
                        break;
                    }
                }
            });
            dw.showLikePopDownMenu();
        }
    });

Если бы это выглядело так, если бы это был внешний ClickListener this.onClickListener в Activity, измените локаль:

public void setOnClickListener(OnClickListener onClickListener) {
    this.onClickListener = onClickListener;
}

public void onClick(final View v) {
    onClickListener.onClick(v);
    dismiss();
}

После нажатия у меня естьисключение:

Thread [<3> main] (Suspended (exception NullPointerException))  
    PopupWindow$1.onScrollChanged() line: 124   
    ViewTreeObserver.dispatchOnScrollChanged() line: 607    
    ViewRoot.draw(boolean) line: 1195   
    ViewRoot.performTraversals() line: 1114 
    ViewRoot.handleMessage(Message) line: 1633  
    ViewRoot(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 

Если я изменю onClick (другой порядок), например:

public void onClick(final View v) {
    dismiss();
    onClickListener.onClick(v);
}

Это работает, но после 6-7 щелчков у меня есть:

Thread [<3> main] (Suspended (exception StackOverflowError))    
    ViewRoot.draw(boolean) line: 1374   
    ViewRoot.performTraversals() line: 1114 
    ViewRoot.handleMessage(Message) line: 1633  
    ViewRoot(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 123 

Ошибка здесь где-то, но я не могу понять, где.

1 Ответ

0 голосов
/ 03 апреля 2012

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

Вместо проверки таймера для null, попробуйте проверить this.window

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