Экран мигает, когда ориентация экрана меняется в Android? - PullRequest
1 голос
/ 14 июля 2011

У меня есть два занятия A и B. Я объявил screenOrientation для A как портрет и для B как пейзаж в файле манифеста. Я начинаю активность с A до B. когда я запускаю действие A, а также заканчиваю действие B, мой экран мигает. Я установил это configChanges для обоих действий как orientation.

это фрагмент кода манифеста:

<application
<activity android:name=".A"
            android:label="@string/app_name" android:theme="@style/MyTheme"
            android:screenOrientation="portrait" android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified"
            android:configChanges="orientation" />
<activity android:name=".B"
            android:label="@string/app_name" android:theme="@style/MyTheme"
            android:screenOrientation="landscape" android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified"
            android:configChanges="orientation" />

</application>

Есть ли идея решить эту проблему ???

Заранее спасибо.

1 Ответ

1 голос
/ 14 июля 2011

Сначала вы пытались переопределить PendingAnimation, когда запускаете намерение между экранами? может быть, некоторые исчезают или что-то в этом роде.

также я вижу, как это может быть проблемой, потому что, когда вы начинаете новое действие, есть небольшой промежуток времени, пока представление не будет раздуто в setContentView, так что, вероятно, вы увидите, что экран становится черным, пока этот шаг не будет завершен. возможно, используйте traceview, чтобы увидеть, где это занимает время, и, возможно, немного оптимизировать методы onCreate-> onDestroy.

Создание деятельности - дорогой процесс. возможно, если вам это действительно надоедает, перейдите с флиппером представления и переместите весь код, который вы можете, в отдельные представления, надувая их из xml (возможно, если они не слишком тяжелые, вы можете загрузить их оба в onCreate и, вероятно, использовать много переменные, объявленные для портретного вида и ландшафта. Вы оставите зависимый код в упражнении и переместите уникальные функциональные возможности для каждого вида в классы представлений.

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

EDIT

Итак, вы хотите сделать что-то вроде этого, позволяя перезапускать представления или сохранять ConfigurationState (в документах Android это говорит о том, что изменение ориентации обрабатывается немного быстрее). Вот код для обработки изменения ориентации с группой действий:

У меня есть 2 действия A и B, которые могут быть любого типа (TAbActivity и т. Д.)

и у меня есть 1 основное действие под названием OrientationChangeActivity:

    public class OrientationChangeActivity extends ActivityGroup {
        private ArrayList<String> mIdList;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mIdList = new ArrayList<String>();
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            startChildActivity("ActivityA", new Intent(this, ActivityA.class));
        } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            startChildActivity("ActivityB", new Intent(this, ActivityB.class));
        }
        }
............

Используется ссылка, размещенная в моем комментарии. У меня есть Активность A с ориентацией портрета и Актом B как Пейзаж. я позволяю OrientationChangeActivity перезапускать себя (не содержит декларации configChage в манифесте), таким образом снова вызывая onCreate и переключая активность.

Вы также можете посмотреть на код:

@Override
public void finishFromChild(Activity child) {
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size() - 1;

if (index < 1) {
    finish();
    return;
}

manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}

, который говорит вам, как создать действие внутри ActivityGroup и установить его для представления. Вы можете использовать этот код для загрузки обеих активаций при создании здесь и установки их в соответствии с изменением ориентации в качестве просмотра содержимого (то есть вам нужно добавить configChage = direction).

...