我正在尝试找到一种方法来正确处理设置活动,其中的方向取决于启动它的意图中的数据.这适用于用户可以选择级别的游戏,其中一些是纵向方向,一些是横向方向.我面临的问题是,setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)在活动完全加载之前不会生效.这对我来说是一个问题,因为我在启动期间进行了一些加载和图像处理,我只想做一次.
目前,如果用户选择了景观级别:
有没有办法避免这种情况,并且没有执行两次加载?例如,理想情况下,即使onCreate被调用,活动也会知道它是应该是横向还是纵向,这取决于启动意图的某些属性,但除非我错过了一些不可能的东西.我已经设法通过boolean在耗时的加载步骤之前检查a来避免重复加载的方法,但这似乎不是正确的方法.我想我可以覆盖onSaveInstanceState,但这需要大量额外的编码.有一个简单的方法吗?
谢谢!
解:
根据丹尼尔的回答,这实际上很容易解决.我只需做一些小改动.在我的"菜单"活动中,玩家将选择要播放的等级,我只需添加一个if/else检查来选择我的Intent将启动哪个类.这是通过一个表示肖像或风景的简单int完成的,当玩家选择一个关卡时确定.然后我创建了第二个扩展我的'GameLogic'类的类; 这是包含游戏本身大部分代码的类,而不是菜单,说明等.
public class GameLandscape extends GameLogic{
}
Run Code Online (Sandbox Code Playgroud)
字面上那简单而完全空洞.这样,它继承了我以前的活动中的所有代码,我已经将其编码为根据方向不同地处理事物.最后,我只需要在清单中添加一行,说明GameLandscape将始终在横向上运行,GameLogic将始终以纵向运行.
确实是一个简单的问题.
我正在使用viewflipper进行fling手势识别,一切正常,但是在2.2和2.1中它抛出异常,因为"java.lang.IllegalArgumentException:Receiver not registered:android.widget.ViewFlipper"下面是完整的调试跟踪.
java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@452f8398
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:814)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.View.dispatchDetachedFromWindow(View.java:6033)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1158)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1630)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewRoot.doDie(ViewRoot.java:2671)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.ViewRoot.die(ViewRoot.java:2641)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218)
09-19 11:33:06.825: ERROR/AndroidRuntime(393): at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436)
09-19 11:33:06.825: …Run Code Online (Sandbox Code Playgroud) android screen-orientation android-sdk-2.1 viewflipper android-2.2-froyo
我正在使用J2ME和LWUIT开发应用程序.我想仅在横向模式下运行此应用程序.对于诺基亚,有一个属性:Nokia-MIDlet-App-Orientation:landscape,但对于其他设备,仅将应用程序限制为横向模式的属性是什么?如何为不同的J2ME设备实现这一目标?
我需要检测反向横向,以防止用户开始捕获垂直视频。
我在layout-land和layout-port文件夹中实现了 2 个布局,其中包含不同的控件集。问题是 Android 不允许我专门为反向景观创建单独的布局。我需要这个,因为在这种情况下视频是倒置的,尽管 UI 显示正确。
如果我将设备从 0 方向旋转到 180 度,Android 甚至不会调用onCreate()我的活动,但在这种情况下视频会翻转。
有人可以建议一个工作示例如何检测某些设备方向(在我的情况下是反向横向)以为此方向使用另一种布局?
据我所知,默认情况下,当设备旋转时,当前活动将被销毁并重新创建。我正在使用 LeftCTRL+F12 旋转模拟器,但它没有被破坏。我在日志中OnDestroy,OnCreate并OnStart和OnResume,但没有那些火了起来,当我旋转设备。
前:

后:

AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geo_quiz"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.geo_quiz.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud) 我不知道标题是否正确,这是怎么回事.
我有一个应用程序在手机和平板电脑上的工作方式不同,在手机上它显示为平板电脑上的肖像,它显示为风景.
为了实现这一点,我创建了一个名为CoreActivity的类,它由我的所有活动扩展,并执行以下操作:
public class CoreActivity extends Activity {
protected boolean _landscape = false;
public boolean isPhone() {
int layoutSize = getScreenLayoutSize();
return (layoutSize == Configuration.SCREENLAYOUT_SIZE_SMALL || layoutSize == Configuration.SCREENLAYOUT_SIZE_NORMAL);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isPhone() && !_landscape) {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
protected int getScreenLayoutSize() {
return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望在横向模式下在手机设置上显示屏幕时出现问题,为此我使用以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
_landscape = true
super.onCreate(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)
问题是,在手机上,如果用户手持手机处于纵向模式(因为大多数应用程序处于纵向模式),则会创建并销毁活动,然后重新创建.但如果他们将它保持在横向模式,那么它只创建一次.
我的问题出现是因为在onCreate方法中我启动了加载数据的线程,我也显示了片段.
有没有办法避免这个问题?有没有办法从纵向模式开始启动活动而不更改它,或者不创建两次?
提前感谢您提供的任何帮助
我有一个 recyclerview 具有不同的纵向和横向布局。当活动开始时,无论方向如何,recyclerview 都会填充数据。但如果方向改变,则不会显示任何数据。并且没有显示有关随之而来的方向变化的数据。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("CCC", "OnCreate View called");
View view = inflater.inflate(R.layout.fragment_coach_list, container, false);
new NetworkConnector(getActivity(), coachListURL, method, null, new OnRequestComplete());
Log.d("CCC", "Network connector called");
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.d("CCC", "On View created called");
//if rv is declared in oncreateview then NPE during setadapter
coachRecyclerView = (RecyclerView) getActivity().findViewById(R.id.fcoachlist_rv);
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
Log.d("CCC", "orientation " + layoutManager.getOrientation());
coachRecyclerView.setLayoutManager(layoutManager);
} …Run Code Online (Sandbox Code Playgroud) android screen-orientation orientation-changes android-recyclerview
我需要在我正在开发的应用程序之一中制作类似于下表的结构。我正在使用 UITableView 创建这个表格,我需要我的表格列宽根据屏幕方向进行更改。我已经为列宽设置了约束,我将使用viewDidLoad() 中的屏幕宽度为这些值赋值。
但是,当屏幕方向发生变化时,我无法弄清楚如何重新对齐这些约束。我发现viewWillTransition()会在方向改变时被调用 & 我重新计算了里面的约束 & 为表视图调用了 setNeedsLayout() 。但是,当屏幕方向改变时,我无法让我的表格视图重置表格列宽。我是 IOS 平台的新手,任何帮助将不胜感激。
HDR_parName/HDR_parValue/HDR_minValue/HDR_maxValue
Para1/value1/minvalue1/maxvalue1
Para2/value2/minvalue2/maxvalue2
当我开始我的应用程序的某个活动时,用户"欢迎"一个对话框,他必须填写一些数据才能继续.然后,在活动本身,用户有2个按钮,使他能够动态创建和删除无限数量的字段(由几个视图组成)
如您所知,当屏幕方向发生变化时,活动将重新启动,因此每个信息都会丢失.显然,这可能会有问题.
为了处理屏幕方向,android文档建议开发人员使用onRetainNonConfigurationInstance().唯一的问题是,如果你使用它来保存上下文中的对象,所有绑定的视图都会泄漏.在我的情况下,这是进一步的问题,因为该活动中的数据固有地与其视图相关联,而视图又与其上下文相关联.
Android文档不建议开发人员自己处理配置更改.他们陈述(并且我引用)"一般来说,短期解决方案只会使他们的生活复杂化"
我可以轻松绕过初始对话框,创建一个hasBeenShown布尔值并将其设置为true.我甚至可以通过保存元数据来绕过"动态创建的视图"问题:在这种情况下,生成的字段数量,类型,彼此的相对位置,文本或选择等等...(有一些小的错误,但没有什么严重的).
但由于字段(视图)是使用layoutInflate动态生成的(因此我们可以拥有无限数量的视图),因此在屏幕方向更改后重新生成这些相同的字段时,即使在模拟器上,应用程序也会变得非常慢.在真实设备(三星Galaxy S)上有20个视野(大约120个视图),花了将近1分钟才完成.
奇怪的是,当我直接传递视图(因此泄漏所有这些东西)时,我的Samsumg Galaxy S花了不到10秒就完成了.
有了这些信息,您认为最好的方法是什么?
(1) - 让字段重置?(不是一个真正的选择,我打赌如果他们无意中倾斜他们的屏幕= P,任何人都会生气
(2) - 添加一个加载屏幕,而android负责改变屏幕方向?
(3) - 阻止屏幕方向改变
(4) - 处理屏幕方向改变自己,并希望阻止Doom Android文档谈论永远不会来.
PS:有点offtopic,但当我的活动结束时,所有内存都被释放了吗?
在发布此问题之前,我已经看过以下链接
http://www.devx.com/wireless/Article/40792/1954
http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html
如果状态是由我的类组成的,如何在Android中的方向更改期间保存状态?
我没有得到如何覆盖以下功能:
@Override
public Object onRetainNonConfigurationInstance() {
return someExpensiveObject;
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我有一个editext可见的布局,当第一个editext的数据验证为true时,其他editext可见.我已将所有其他editextes和textviews的可见性设置为false,并在验证后使它们可见.
因此,在我的活动中,如果更改了屏幕方向,则所有项目都将变为android:visibility="false"不可见.
我也知道当我们的活动屏幕方向改变时,它调用onStop()后跟onDestroy(),然后通过调用onCreate()再次启动一个新活动
这是原因..但我没有得到如何解决它..
在这里您可以看到我的应用程序的屏幕截图:
在此图像中,所有字段都被加载,而在另一个图像中,当屏幕方向变为横向时,它们都消失了

任何教程或代码片段的链接都会非常值得注意.
而且还当我的应用程序崩溃进度对话框显示了,我试图改变屏幕orientation.How来处理这个?
谢谢
android ×8
ios ×1
java ×1
java-me ×1
landscape ×1
layout ×1
lwuit ×1
memory-leaks ×1
swift ×1
uitableview ×1
viewflipper ×1