【发布时间】:2018-12-13 16:19:33
【问题描述】:
Android 布局。如何为 AndroidMainfest.xml 的应用程序标签中的所有活动设置固定方向? 我不想单独为每个活动设置方向。 提前致谢。
【问题讨论】:
标签: android layout orientation
Android 布局。如何为 AndroidMainfest.xml 的应用程序标签中的所有活动设置固定方向? 我不想单独为每个活动设置方向。 提前致谢。
【问题讨论】:
标签: android layout orientation
GoogleIO 应用有一个 ActivityHelper 类。它有一个名为initialize() 的静态方法,它处理每个活动发生的很多事情。然后,您需要记住的只是 onCreate() 方法中的 1 行代码,它可以处理设置该值以及每个活动所需的其他几个代码。
编辑:没有导入或类似的东西。创建一个名为 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
编辑:抱歉...您需要通过 Activity。见上面的代码
【讨论】:
接受的答案,以及任何暗示 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")。
【讨论】:
如果您使用泛型编写项目。
你有类似“BaseActivity”的东西,而不是 onCreate 它你可以编写这样的代码:
例如: BaseActivity 扩展 AppCompatActivity,稍后你使用 YourActivity 扩展 基础活动
肖像
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
风景
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
【讨论】:
(Monodroid/C# 代码)
你可以创建一个抽象基类
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
【讨论】:
我得到了最好的解决方案。您不必将任何活动作为参数和东西传递。
这是你必须做的。
创建一个类并像这样扩展您的应用程序。 实现 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> 内的 Manifest 文件中添加以下内容:
android:name=".OldApp"
最终结果会是这样的:
<application
android:name=".OldApp"
...other values... >
<activity
android:name=".SomeActivity"></activity>
</application>
【讨论】: