Почему моя основная активность отображается на черном экране/скрыта при возврате из другой активности?

Мое приложение использует ES File Explorer для загрузки/сохранения файлов с использованием намерения com.estrongs.action.PICK_FILE. Он переходит в браузер, все в порядке, делает свое дело и возвращает результат, но при возвращении к основному действию основное не видно. Он сосредоточен. Я могу использовать жест броска, и клавиатура открывается, когда вы нажимаете текст редактирования (скрытый). OnActivityResult() вызывается и также обрабатывается нормально. У меня нет никакого кода в моих onResume, OnStop и т. д. Я добавил логарифм ниже, но, как вы можете видеть, он ничего не показывает.

Не знаю, стоит ли об этом упоминать, но я также использую SherlockActionBar.

Наконец, это самое смешное. В моей деятельности есть вкладка с двумя основными видами. 1 — это ListView, а 1 — это настраиваемое представление, использующее OnDraw(). Если я загружаю файл, который должен отображаться в списке, все в порядке. Если я загружаю файл для пользовательского представления, он скрыт.

Пожалуйста, где мой фатальный недостаток?

намерение начинается так

intent = new Intent("com.estrongs.action.PICK_FILE");
        intent.putExtra("com.estrongs.intent.extra.TITLE", "Open");
        goingtobrowser = true;
        startActivityForResult(intent, REQUEST_CODE_PICK_FILE_OR_DIRECTORY);

и OnActivityResult() выглядит так

if (resultCode == RESULT_OK && data != null) {
            // obtain the filename
            if (D)
                Log.e(TAG, "++ Coming back from Browser ++");
            Uri fileUri = data.getData();
            if (fileUri != null) {
                String filePath = fileUri.getPath();
                if (filePath != null) {
                    //do something with the path
                }
            }
        }

    06-21 11:16:15.421: E/BTUI(12000): ++ ON START ++
    06-21 11:16:15.421: D/BTUI(12000): ++ ON RESUME ++
    06-21 11:16:15.571: W/KeyCharacterMap(12000): No keyboard for id -1
    06-21 11:16:15.571: W/KeyCharacterMap(12000): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
    06-21 11:16:15.801: D/dalvikvm(12000): GC_EXTERNAL_ALLOC freed 435K, 41% free 4138K/6983K, external 3976K/4039K, paused 29ms
    06-21 11:16:15.841: D/dalvikvm(12000): GC_EXTERNAL_ALLOC freed 33K, 42% free 4105K/6983K, external 4000K/4885K, paused 27ms
    06-21 11:16:19.121: E/BTUI(12000): ++ Going to Browser ++
    06-21 11:16:19.171: D/BTUI(12000): ++ ON onSaveInstanceState ++
    06-21 11:16:19.171: D/BTUI(12000): ++ ON PAUSE ++
    06-21 11:16:19.611: D/BTUI(12000): ++ ON STOP ++
    06-21 11:16:35.801: D/BTUI(12000): onActivityResult -1
    06-21 11:16:41.351: E/BTUI(12000): ++ Coming back from Browser ++
    06-21 11:16:42.481: E/BTUI(12000): ++ ON START ++
    06-21 11:16:42.481: D/BTUI(12000): ++ ON RESUME ++
    06-21 11:17:07.751: I/System.out(12000):  in onFling() :: 

** РЕДАКТИРОВАТЬ. Посмотрев больше на 1-ю загрузку пользовательских представлений, вызывается onDraw(), поэтому я поместил customview.invalidate() в основные действия onResume(). Поэтому при возврате из второго действия это должно быть вызвано, и представление становится недействительным и вызывает onDraw(). Нет, это не так! Я думаю, это проблема. Пожалуйста, какие-нибудь идеи??

** РЕДАКТИРОВАТЬ единственный способ, которым я мог избавиться от черного экрана, состоял в том, чтобы аннулировать весь главный экран с помощью

ViewGroup vg = (ViewGroup) findViewById (R.id.main);
    vg.invalidate();

в onResume().

НО это недостаточно для меня, потому что мне нужно вызвать view .invalidate() или view.postinvalidate() из других потоков, и это НЕ вызывает customview.onDraw(), и экран остается пустым с этими вызовами. Кто угодно??


person user960914    schedule 21.06.2012    source источник


Ответы (1)


Я думал, что отвечу на свой вопрос, и, возможно, кто-то сможет объяснить это лучше меня. Проблема, по-видимому, связана с обратным вызовом поверхности представлений при возврате из другого действия. Мне удалось исправить это только с помощью setContentView(). mainViewGroup.invalidate(), о котором я упоминал выше, не работает. Затем я заметил, что view.invalidate() мне не подходит, поэтому я переключил его на представление поверхности. Это выявило проблему обратного вызова.

Если я удалил обратный вызов представления держателя поверхности в surfaceDestroyed(), он работал нормально, основной возвращался нормально. НО динамическое повторное подключение обратного вызова в onResume() не работало. Поверхностный вид не прикреплялся. Поэтому мне ВСЕ ЕЩЕ нужно сделать setContentView() для сброса настроек. Это работает, но я хотел бы услышать «более чистое» решение. Спасибо, что посмотрели.

person user960914    schedule 30.06.2012
comment
Еще не услышали хорошее решение? У меня проблема с галереей и камерой при возврате. - person Juan Labrador; 11.09.2015
comment
Решение для меня состояло в том, чтобы перенести все, что я делал с файлом, в AsyncTask. Что-то, что я делаю, блокирует поток пользовательского интерфейса, поэтому приложение не может ничего отображать. - person Joel Page; 05.02.2018