防止Android上的屏幕旋转

时间:2010-04-28 15:25:15

标签: android rotation screen

我有一个我希望阻止旋转的活动,因为我正在启动AsyncTask,屏幕旋转使它重新启动。

有没有办法告诉这项活动“即使用户像疯了一样摇动手机也不要旋转屏幕”?

14 个答案:

答案 0 :(得分:432)

添加

android:screenOrientation="portrait" 

 android:screenOrientation="landscape" 

<activity>元素中 清单,你已经完成了。

答案 1 :(得分:124)

您可以按照以下逻辑阻止 AsyncTask正在运行时自动旋转屏幕

  1. 使用getRequestedOrientation()将您当前的屏幕方向存储在您的活动中。
  2. 使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)停用自动屏幕方向。
  3. 运行/执行AsyncTask
  4. AsyncTask结束时使用setRequestedOrientation(oldOrientation)恢复您之前的定位状态。
  5. 请注意,在Activity内有多种方法可以访问AsyncTask(在UI线程上运行)属性。您可以将AsyncTask实现为内部类,也可以使用戳Activiy类的消息Handler

答案 2 :(得分:26)

在您的清单文件中,对于要锁定屏幕旋转的每个活动,添加:如果要以水平模式锁定它:

<activity
        ...
        ...
        android:screenOrientation="landscape">

或者如果您想以垂直模式锁定它:

<activity
            ...
            ...
            android:screenOrientation="portrait">

答案 3 :(得分:23)

我发现这样做的最简单方法是放

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

中的

,在

之后
setContentView(R.layout.activity_main);

所以...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

答案 4 :(得分:5)

<强> Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

<强>的AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

答案 5 :(得分:5)

您可以这样做,而不是进入AndroidManifest:

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

这里唯一的缺点是它需要API等级18或更高。所以基本上这是矛的尖端。

答案 6 :(得分:2)

AndroidManifest.xml中的ACTIVITY的以下属性就是您所需要的:

android:configChanges="orientation"

因此,完整活动节点将是:

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

答案 7 :(得分:1)

添加:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

答案 8 :(得分:1)

将以下内容添加到您的AndroidManifest.xml

[app> src> main> AndroidManifest.xml]

   import UIKit
         import Firebase
         import FirebaseDatabase


    class PledgeTableViewCell: UITableViewCell {

var plusBtnAction: ((String) -> Void)?
var minusBtnAction: ((String) -> Void)?

@IBOutlet weak var rewardAmtLabel: UILabel!
@IBOutlet weak var ticketClasslabel: UILabel!
@IBOutlet weak var ticketDescLabel: UILabel!

@IBOutlet weak var ticketCountLabel: UILabel!
@IBOutlet weak var plusBtn: UIButton!
@IBOutlet weak var minusBtn: UIButton!

var ref: DatabaseReference!
var currentID = ""
var ticket_count: Int = 0

@IBAction func minusBtn(_ sender: Any) {

    if var tickCount = Int(ticketCountLabel.text!) {

        if(tickCount > 0)
        {
            tickCount -= 1
            ticketCountLabel.text = String(tickCount)
            self.minusBtnAction?(String(tickCount))
        }

    }


  //  self.minusBtnAction?(String(tickCount))
}


var reward: Rewards! {
    didSet {

        rewardAmtLabel.text = "Rs. " + String(reward.rewardAmt)
        ticketClasslabel.text = reward.reward_class_name
        ticketDescLabel.text = reward.reward_desc
        print(reward.reward_class_name + " is one of the rewards")
    }

}

@IBAction func plusBtn(_ sender: AnyObject) {


    if var tickCount = Int(ticketCountLabel.text!) {
        tickCount += 1
        ticketCountLabel.text = String(tickCount)
        print("The ticket counting before sending is:" + String(tickCount))
        self.plusBtnAction?(String(tickCount))

    }



}


    }

示例:

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

答案 9 :(得分:0)

如果您使用Android Developer Tools(ADT)和Eclipse 你可以去你的AndroidManifest.xml - &gt; 应用标签 - &gt;下来选择你的活动。最后,选择您的首选方向。 您可以选择众多选项中的一个。

答案 10 :(得分:0)

您必须在manifest.xml文件中添加以下代码。 它不应该在该活动中旋转的活动添加此元素

android:screenOrientation="portrait"

然后它不会旋转。

答案 11 :(得分:0)

即使活动发生变化,也可以使用 AsyncTaskLoader 来确保数据安全,而不是使用 AsyncTask 来构建应用,这比防止屏幕旋转更好。

答案 12 :(得分:0)

防止屏幕旋转只需将以下行添加到清单中即可。

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

这对我有用。

答案 13 :(得分:0)

您的AndroidManifest.xml文件中的

用户"portrait"似乎是一个很好的解决方案。但是,这会迫使某些设备(在横向条件下效果最好)进入纵向状态,而无法获得正确的方向。在最新的Android版本上,您会遇到错误。因此,我的建议最好使用"nosensor"

<activity
        ...
        ...
        android:screenOrientation="nosensor">