在Android轮播上重新启动活动


1378

在我的Android应用程序中,当我旋转设备(滑出键盘)时,我Activity将重新启动(onCreate称为)。现在,这大概是应该的样子,但是我在onCreate方法中做了很多初始设置,因此我需要:

  1. 将所有初始设置都放在另一个功能中,这样就不会因设备旋转或
  2. 使其onCreate不再被调用,布局只是调整或
  3. 将应用程序限制为仅纵向,这样onCreate就不会被调用。

4
此博客文章中,也有关于如何在活动配置更改期间保留长时间运行的异步任务的相当完整的说明!
Adrian Monk 2014年

3
这不是直接的答案,因为其他人已经回答了,但是我邀请您看看LogLifeCycle来了解您的Android应用程序在生命周期方面发生了什么。
Snicolas 2014年

Answers:


965

使用应用程序类

根据您在初始化过程中所做的事情,您可以考虑创建一个新的类来扩展该类,Application并将初始化代码移动到onCreate该类中的重写方法中。

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

onCreate创建整个应用程序时在应用程序类只叫,等方向或键盘知名度转变活动重启不会触发它。

优良作法是将此类的实例公开为单例,并使用getter和setter公开要初始化的应用程序变量。

注意:您需要在清单中指定新Application类的名称,以便注册和使用它:

<application
    android:name="com.you.yourapp.MyApplicationClass"

对配置更改做出反应 [更新:自API 13起已弃用;有关详细信息,请参阅参考资料请参阅推荐的替代方法 ]

作为另一种选择,您可以让您的应用程序监听会导致重启的事件(例如方向和键盘可见性更改),并在Activity中处理它们。

首先将android:configChanges节点添加到“活动”的清单节点

 <activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

或适用于Android 3.2(API级别13)及更高版本

<activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">

然后在Activity中覆盖该onConfigurationChanged方法并调用setContentView以强制以新的方向重新完成GUI布局。

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

17
我认为第二种方法行不通。我尝试过这个; 一个带有EditText的活动。我在那里写了一些文字,改变了方向,文字消失了/重置了。
泰德(Ted)2010年

231
希望我们将来能看到onRotate()方法。坦率地说,甚至不得不担心这样的事情令人沮丧。
凯利·萨顿

84
请注意,《 Android开发指南》警告不要使用此方法: 注意:android:configChanges应避免使用(),并且只能将其用作最后一种手段。请阅读处理运行时更改以获取有关如何正确处理由于配置更改而导致的重新启动的更多信息。 取而代之的是,要在轮换事件之间保留数据,他们似乎更喜欢使用onSaveInstanceState Bundle;。或@ Jon-O 提到onRetainNonConfigurationInstance
杰夫罗2011年

19
这是一个不好的解决方案,因为它仅对当前已知的配置更改作出反应。在较新的Android版本中,可能会发生其他配置更改,而此代码将无法捕获(因为它必须在清单中列出所有配置更改)。用来保存状态的解决方案具有onRetainNonConfigurationChanges更高的容错性和直截了当。
Bananeweizen 2011年

16
我认为您应该答案中添加3.2的此更新,这很重要(正好面对该问题)并且可能会被忽略。
bigstones 2012年

185

Android 3.2及更高版本的更新:

注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会更改。因此,如果要防止在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而导致运行时重新启动,则必须在该"screenSize"值之外添加该"orientation"值。也就是说,您必须声明android:configChanges="orientation|screenSize"。但是,如果您的应用程序以API级别12或更低级别为目标,则您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动)。


1
感谢您的澄清,因为上面对此的评论几乎使我无法进行调查。我目前的目标是API 8,我的代码在configChanges上没有screenSize,并且可以确认它在运行ICS的设备上可以正常工作(无需重新定向)。
卡尔

感谢您指出这一点,我只设置了android:configChanges =“ orientation | screenSize”,方向切换正在重新创建我的Activity,对于我一生,我不知道为什么!
克里斯托弗·佩里

5
添加android:configChanges 只能用作不得已的方法。考虑使用FragmentssetRetainInstance代替。
西蒙·佛斯伯格

关键点是screenSizeAndroid 3.2及更高版本,它解决了我的问题,谢谢!
fantouch

127

与其尝试完全停止onCreate()触发,不如尝试检查Bundle savedInstanceState该事件,不如传递到事件中的事件以查看其是否为null。

例如,如果我有一些逻辑应在Activity真正创建时运行,而不是在每次方向更改时都应运行,则仅在以下情况onCreate()下运行该逻辑:savedInstanceState为null。

否则,我仍然希望布局重新绘制以适应方向。

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

不知道这是否是最终答案,但这对我有用。


6
您实际上在哪里保存状态?
Ewoks 2012年

5
这似乎对我有用,而且似乎是最简单的方法。我注意到您为此仅获得了4个收益(包括我的5个收益),而关于应用程序子类化的想法却只有373个收益,在我看来,这要复杂得多。这种方法有什么缺点吗?
2013年

4
这个解决方案对我来说很棒。我能够Intent serverintent = new Intent(MainActivity.this, MessageListener.class);startService(serverintent);使用创建一个serverSocket = new ServerSocket(0xcff2);Socket client = serverSocket.accept();BufferedReader(new InputStreamReader(client.getInputStream()));并且可以旋转我的android并保持客户端/服务器连接处于活动状态,但可以旋转GUI。根据手册,在关闭最后一个活动时,将对savedInstanceState进行初始化。
Fred F

3
我不明白,有什么收获?与其他解决方案相比,此方法效果很好,并且复杂度大大降低。
RTF

3
这是在Android中执行此操作的正确方法。其他基本上可以通过configChanges进行轮换的方法,这些方法都是笨重,复杂和不必要的。
LukeWaggoner 2014年

99

我做了什么...

在清单中的“活动”部分中添加:

android:configChanges="keyboardHidden|orientation"

在活动代码中,实现了:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

3
需要说明的是:在我的实现中,您现在可以在onCreate()中进行变量初始化,并且只需调用onConfigurationChanged()即可进行屏幕旋转。您的变量现在不受屏幕旋转的影响;-) nice和ez
Someone Somewhere'Apr

2
我按照这里的描述进行了所有操作,但是当我在方向改变后尝试按下一个按钮时,我得到了NullPointerException异常。有什么事吗
Finnboy11年

5
请记住,我的回答就像3岁,而Android也在不断发展……Simon-您是否有示例代码的链接?那就是人们所需要的。
某处某人2013年

3
当警告android:configChanges时,@SimonAndréForsberg实际上只是在解释Android文档处理运行时更改具有有关替代方法(包括示例代码)的更多详细信息。
Leif Arne Storset

67

您描述的是默认行为。您必须自己添加以下内容来检测和处理这些事件:

android:configChanges

到清单,然后更改要处理的内容。因此,对于定向,您将使用:

android:configChanges="orientation"

对于打开或关闭的键盘,您可以使用:

android:configChanges="keyboardHidden"

如果要同时处理这两种情况,则可以使用管道命令将它们分开,例如:

android:configChanges="keyboardHidden|orientation"

这将在您调用的任何Activity中触发onConfigurationChanged方法。如果您覆盖该方法,则可以传入新值。

希望这可以帮助。


2
@GregD我知道,这就是为什么现在是个更新它以反映当今情况的好时机。鉴于这个问题的支持人数众多,SO上的其他问题仍在引用它。
西蒙·佛斯伯格

48

我刚刚发现了这个传说:

为了通过定向更改使活动保持活动状态并通过进行处理onConfigurationChanged上述文档代码示例在清单文件中提出了建议:

<activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

它具有始终有效的额外好处。

额外的知识是,省略keyboardHidden可能看起来合乎逻辑,但这会导致模拟器失败(至少适用于Android 2.1):仅指定orientation将使模拟器同时OnCreateonConfigurationChanged有时)同时调用OnCreate其他时间。

我还没有看到设备上的故障,但是我听说模拟器对其他设备失败。因此,值得记录。


14
注意:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会更改。因此,如果要防止在开发API级别13或更高级别时因方向更改而导致运行时重新启动,请执行以下操作:android:configChanges =“ orientation | keyboardHidden | screenSize”
Geltrude 2012年

是的,模拟器消耗大量时间。您不能依靠它来准确地报告配置更改。
IgorGanapolsky

添加android:configChanges 只能用作不得已的方法。考虑使用FragmentssetRetainInstance代替。
西蒙·佛斯伯格

38

您可能还会考虑使用Android平台的方法来跨方向更改持久化数据: onRetainNonConfigurationInstance()getLastNonConfigurationInstance()

这样一来,您就可以在配置更改期间保留数据,例如,您可能是从服务器获取的信息中获取的信息,或在此onCreate之后获取的信息,同时还允许Android Activity使用xml文件重新布局您当前使用的方向。

看到这里这里

应该注意的是,现在不建议使用这些方法(尽管比大多数解决方案所建议的,要比改变方向更灵活),建议每个人都切换到您要保留的每个Fragments方法setRetainInstance(true)Fragment


3
我真的认为Fragments和setRetainInstance是执行此操作的最佳方法(Google推荐的方法),对您+1,对所有其他-1。添加android:configChanges 仅应作为最后的手段
Simon Forsberg,

32

该方法很有用,但在使用片段时不完整。

片段通常在配置更改时重新创建。如果您不希望这种情况发生,请使用

setRetainInstance(true); 在Fragment的构造函数中

这将导致片段在配置更改期间被保留。

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)


7
同意 使用最新的Android API,片段似乎是处理此问题的正确方法。我自己还没有尝试过,但是从阅读本页面的经验来看,您基本上将在Activity中实现的内容的99%移到Fragment的子类中,然后将该Fragment添加到Activity中。该活动仍会在屏幕旋转时被破坏并重新创建,但是您可以使用上述@Abdo方法明确告诉android 不要破坏Fragment setRetainInstance()
brianmearns 2012年

25

我只是简单地添加

     android:configChanges="keyboard|keyboardHidden|orientation"

在清单文件中,没有添加任何onConfigurationChanged在我的活动中方法。

因此,每次键盘滑出或滑入都不会发生


添加到<application ...android:configChanges="keyboard|keyboardHidden|orientation">它,并且正在工作。我在build.gradle中的设置:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
JuniorMayhé16年

19

onCreate即使您更改orientationandroid 的方法,该方法仍会被调用。因此,将所有繁重的功能移至此方法都无济于事



17
 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

清单的哪一部分告诉它“不要调用 onCreate() ”?

此外,谷歌的文档说,以避免使用android:configChanges(除非万不得已)......但随后的替代方法,他们建议所有DO使用android:configChanges

根据我的经验,仿真器总是onCreate()在旋转时调用。
但是我在同一设备上运行相同代码的1-2个设备却没有。(不确定为什么会有任何区别。)


16

这很简单,只需执行以下步骤:

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

这对我有用:

注意:方向取决于您的要求


15

在Android清单中要进行的更改是:

android:configChanges="keyboardHidden|orientation" 

活动中要添加的内容有:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

15

将此行添加到清单:

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"

这是活动的摘要:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

14

做这件事有很多种方法:

保存活动状态

您可以将活动状态保存在中onSaveInstanceState

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

然后使用bundle恢复状态。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

自行处理方向变化

另一种选择是自己处理方向变化。但这不是一个好习惯。

将此添加到清单文件。

android:configChanges="keyboardHidden|orientation"

对于Android 3.2及更高版本:

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

限制旋转

您也可以将活动限制为纵向或横向模式,以避免旋转。

将此添加到清单文件中的活动标签中:

        android:screenOrientation="portrait"

或在您的活动中以编程方式实施此操作:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

11

我发现执行此操作的方法是使用onRestoreInstanceStateonSaveInstanceState事件将内容保存在中Bundle(即使您不需要保存任何变量,也只需在其中放置内容,这样Bundle就不会为空)。然后,在该onCreate方法上,检查as是否Bundle为空,如果为空,则进行初始化,如果不是,则进行初始化。


11

即使不是“ Android方式”,我也可以通过自己处理方向更改并简单地将小部件重新放置在视图中以考虑更改的方向来获得很好的效果。这比任何其他方法都快,因为不必保存和还原视图。由于重新定位的窗口小部件与刚刚移动和/或调整大小的窗口小部件完全相同,因此它还为用户提供了更加无缝的体验。以这种方式不仅可以保留模型状态,还可以保留视图状态。

RelativeLayout对于有时需要重新定向的视图,有时可能是一个不错的选择。您只需要为每个子窗口小部件提供一组纵向布局参数和一组横向布局参数,每个参数具有不同的相对定位规则。然后,在您的onConfigurationChanged()方法中,将适当的方法传递setLayoutParams()给每个孩子的电话。如果任何子控件本身需要在内部重新定向,则只需在该子控件上调用一个方法来执行重新定向。那个孩子同样呼吁任何方法需要重新定位内部,等子控件。


我希望看到一些示例代码,看起来很棒!
Henrique de Sousa

8

每次旋转屏幕时,打开的活动都会完成,并再次调用onCreate()。

1。您可以做一件事来保存屏幕旋转时活动的状态,以便在再次调用活动的onCreate()时可以恢复所有旧内容。推荐这个 链接

2。如果要防止重新启动活动,只需在manifest.xml文件中放置以下几行即可。

  <activity android:name=".Youractivity"
  android:configChanges="orientation|screenSize"/>

7

您需要使用onSavedInstanceState方法将所有值存储到其参数是否为bundle

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

和使用

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

检索并设置值以查看对象,它将处理屏幕旋转


这需要API级别22
穆罕默德Afrashteh

6

注意:如果将来有人遇到与我相同的问题,我会发布此答案。对我来说,以下行是不够的:

android:configChanges="orientation"

当我旋转屏幕时,没有调用方法onConfigurationChanged(Configuration newConfig)。

解决方案:即使问题与方向有关,我也必须添加“ screenSize”。因此,在AndroidManifest.xml-文件中,添加以下内容:

android:configChanges="keyboardHidden|orientation|screenSize"

然后实施方法 onConfigurationChanged(Configuration newConfig)




4

人们说你应该使用

android:configChanges="keyboardHidden|orientation"

但是在Android中处理旋转的最好,最专业的方法是使用Loader类。它不是一个著名的类(我不知道为什么),但是它比AsyncTask更好。有关更多信息,您可以阅读Udacity的Android课程中的Android教程。

当然,作为另一种方法,您可以使用onSaveInstanceState存储值或视图,并使用onRestoreInstanceState读取它们。完全取决于您。


是的,让我们添加一些额外的代码以使其看起来像“专业”。或者,仅使用configurationChanges属性坚持快速,轻松,真实且经过尝试的方式。
AndroidDev '19

3

经过一段时间的反复试验,我找到了适合大多数情况的解决方案。这是代码:

清单配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.pepperonas.myapplication">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

主要活动:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

和示例片段:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

可以在github上找到。


3

使用orientation侦听器以不同的方向执行不同的任务。

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

3

将以下代码放在Activityin中Android Manifest

android:configChanges="orientation"

当您更改方向时,这不会重新开始您的活动。


2
@Mavamaarten可能是因为正如其他人指出的那样,这是很糟糕的做法,而其他十个答案已经涵盖了这一点。
MikkoP 2014年

3

将屏幕方向(横向或纵向)固定为 AndroidManifest.xml

android:screenOrientation="portrait" 要么 android:screenOrientation="landscape"

为此,onResume()不会调用您的方法。


5
到底如何解决是一个答案?如果锁定使用设备的用户,为什么我们的设备可以旋转?
2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.