Как я могу установить ориентацию фиксированной для всех видов деятельности - PullRequest
6 голосов
/ 05 июля 2011

Android Layout. Как я могу установить Ориентацию Исправлено для всех действий в теге приложения AndroidMainfest.xml? Я не хочу устанавливать ориентацию для каждого вида деятельности индивидуально. Заранее спасибо.

Ответы [ 5 ]

17 голосов
/ 07 июля 2011

Приложение GoogleIO имеет класс ActivityHelper. Он имеет статический метод с именем initialize(), который обрабатывает множество вещей, которые происходят с каждым действием. Тогда вам нужно запомнить только одну строку кода в методе onCreate(), которая может обрабатывать установку этого значения и несколько других, необходимых для каждого действия.

Редактировать: Нет импорта или что-то в этом роде. Создайте класс с именем ActivityHelper

public class ActivityHelper {
    public static void initialize(Activity activity) {
        //Do all sorts of common task for your activities here including:

        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

Тогда во всех ваших активациях вызов метода onCreate () ActivityHelper.initialize() Если вы также планируете разработку таблиц, вы можете рассмотреть возможность использования:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

Я написал больше об этом здесь

Редактировать: Извините ... вам нужно пройти задание. см. код выше

4 голосов
/ 25 октября 2017

Принятый ответ и все, что предполагает setRequestedOrientation, далеко не идеален, потому что, , как указано в документации , вызов setRequestedOrientation во время выполнения, может привести к перезапуску действия, что кроме всего прочего, влияет на анимацию между экранами.

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

Существуют некоторые предостережения относительно редактирования AndroidManifest таким способом, о котором вам необходимо знать:

Моим требованием было обновить все действия, чтобы они имели фиксированную ориентацию, но только в выпусках сборки . Я добился этого с помощью небольшого кода в build.gradle, который выполняет простую замену строк в AndroidManifest (при условии, что нет действий уже имеет указанную ориентацию):

Пример решения, совместимого с Android Studio 3.0 (касается только действий, соответствующих com.mycompany.*):

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        if (output.name == "release") {
            output.processManifest.doLast {
                String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
                def manifestContent = file(manifestPath).getText('UTF-8')
                // replacing whitespaces and newlines between `<activity>` and `android:name`, to facilitate the next step
                manifestContent = manifestContent.replaceAll("<activity\\s+\\R\\s+", "<activity ")
                // we leverage here that all activities have android:name as the first property in the XML
                manifestContent = manifestContent.replace(
                        "<activity android:name=\"com.mycompany.",
                        "<activity android:screenOrientation=\"userPortrait\" android:name=\"com.mycompany.")
                file(manifestPath).write(manifestContent, 'UTF-8')
            }
        }
    }
}

Пример решения, совместимого с Android Studio 2.3 (соответствует всем действиям, но не соответствует <activity-alias> записям):

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        if (output.name == "release") {
            output.processManifest.doLast {
                def manifestOutFile = output.processManifest.manifestOutputFile
                def newFileContents = manifestOutFile.getText('UTF-8')
                        .replaceAll(/<activity(?!-)/, "<activity android:screenOrientation=\"userPortrait\" ")
                manifestOutFile.write(newFileContents, 'UTF-8')
            }
        }
    }
}

Я использовал userPortrait вместо portrait, так как я предпочитаю предоставить пользователю больше гибкости.

Вышеуказанное работает из коробки, если у вас есть только варианты (отладка, выпуск). Если у вас есть дополнительные вкусы, вам, возможно, придется немного их настроить.

Вы можете удалить if (output.name == "release") в зависимости от ваших потребностей.

2 голосов
/ 10 марта 2017

Если вы пишете свой проект с использованием дженериков.

И у вас есть что-то вроде "BaseActivity", чем внутри onCreate , если вы можете написать такой код:

Например: BaseActivity расширяет AppCompatActivity, позже вы используете YourActivity расширяет BaseActivity

Портрет

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Пейзаж

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
0 голосов
/ 01 августа 2018

Я получил лучшее решение.Вам не нужно передавать какие-либо действия в качестве параметра и прочее.

Вот что вам нужно сделать.

Создайте класс и расширьте свое приложение следующим образом.Реализуйте onActivityCreated и onActivityStarted и добавьте код, который устанавливает ориентацию в зависимости от того, что вам нужно.

public class OldApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityStarted(Activity activity) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }

            @Override
            public void onActivityCreated(Activity activity,
                                          Bundle savedInstanceState) {
              activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
              }
        });
    }
}

После этого добавьте в файл манифеста следующее: <application block>:

android:name=".OldApp"

Конечный результат будет таким:

<application
    android:name=".OldApp"
    ...other values... >
    <activity
        android:name=".SomeActivity"></activity>
</application>
0 голосов
/ 14 мая 2013

(Monodroid / C # code)

Вы можете создать абстрактный базовый класс

public abstract class ActBase : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        RequestedOrientation = clsUtilidades.GetScreenOrientation();
    }
 }

Тогда все ваши действия должны наследовать этот класс вместо Activity

Что-то вроде

[Activity(Label = "Orders", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.Mcc | ConfigChanges.Mnc)]
public class ActOrders : ActBase
{
  ....

Этот способ позволяет избежать вызова ActivityHelper в ваших событиях

...