Android布局。如何为AndroidMainfest.xml的应用程序标签中的所有活动设置Orientation Fixed? 我不想单独为每个活动设置方向。 提前谢谢。
答案 0 :(得分:17)
GoogleIO应用有一个ActivityHelper类。它有一个名为initialize()
的静态方法,可以处理每个Activity发生的很多事情。然后,您需要记住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);
我写了更多关于这个here
的文章修改抱歉......您需要传递活动。见上面的代码
答案 1 :(得分:4)
接受的答案以及任何暗示setRequestedOrientation
的内容都远非完美,因为as stated in documentation,在运行时调用setRequestedOrientation
可能导致活动重新启动,其中其他因素影响屏幕之间的动画。
如果可能,最好在AndroidManifest.xml
中设置所需的方向。
但是,由于在添加新活动时依赖每个开发人员记住修改清单的错误,因此可以在构建时通过在构建期间编辑AndroidManifest文件来完成。
以这种方式编辑AndroidManifest有一些注意事项,但您需要注意:
<activity-alias>
个条目,则应该匹配<activity(?!-)
而不是<activity
以避免修改这些条目(并使用匹配正则表达式的replaceAll
,而不是replace
,它匹配字符串)我的要求是更新所有具有固定方向的活动,但仅限于发布版本。我用build.gradle
中的一些代码实现了它,它在AndroidManifest中进行了简单的字符串替换(假设活动的 none 已经指定了方向):
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 :(得分:2)
如果您使用泛型编写项目。
你有类似&#34; BaseActivity&#34;在 onCreate 之内,您可以编写类似的代码:
例如: BaseActivity扩展了AppCompatActivity,稍后您使用YourActivity扩展 BaseActivity
<强>肖像强>
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
<强>风景强>
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
答案 3 :(得分:0)
(Monodroid / C#代码)
您可以创建抽象基类
public abstract class ActBase : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
RequestedOrientation = clsUtilidades.GetScreenOrientation();
}
}
然后,您的所有活动都必须继承此类,而不是活动
喜欢
[Activity(Label = "Orders", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.Mcc | ConfigChanges.Mnc)]
public class ActOrders : ActBase
{
....
这样可以避免在事件中调用 ActivityHelper
答案 4 :(得分:0)
我有最好的解决方案。您不必通过任何活动作为参数和东西。
这就是您要做的。
创建一个类并像这样扩展您的应用程序。 实现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>