Articles of android orientation

Android方向更改调用onCreate

我创建了一个搜索屏幕,其中包含一个用于关键字,filter和搜索按钮的选项卡,以及三个用于不同types结果的可选选项卡(每个选项卡包含一个带有ArrayAdapter的ListView )。 启动活动时,如果已执行搜索,开发人员可以选择将结果作为额外的Parcelable[]传递。 在onCreate()方法中,我正在创建Parcelable[]传递的三个选项卡中的每一个。 当我从filter选项卡上的按钮调用搜索时,我清除选项卡并使用新结果重新创建它们,这非常有效。 问题是,当您旋转设备时,Android的自动方向切换支持似乎会重新创建整个活动,并调用onCreate() 。 这意味着我的搜索结果将重置为启动活动时传递的Parcelable[] 。 到目前为止,我唯一的解决方案是调用finish()然后调用startActivity()来基本上重新启动具有新结果的活动。 我确信必须有一个更简单的解决方案,而且我做了一些非常无趣的事情。 有一个更好的方法吗?

更改方向的单活动应用中的YouTubePlayerSupportFragment

我试图解决这个问题,通过互联网搜索,没有find真正的答案。 我正在开发一款需要YouTube播放器的应用。 此播放器是YouTubePlayerSupportFragment因为它位于支持片段中(因此它也是嵌套的)。 初始设置后,我意识到每当我旋转手机时,video就会停止播放,必须重新启动。 这显然不是我想要的。 然后我发现了一些SO答案( 像这样 ),人们说Activity需要处理配置更改,所以我在清单中的Activity中添加了android:configChanges=”keyboardHidden|orientation|screenSize” 。 这解决了这个问题,video现在即使在方向改变时也能继续播放,全屏旋转看起来并不难看。 很酷,我说,只是意识到这大大困扰了应用程序的其他部分,因为配置现在正在所有视图到位后更新。 这意味着如果我的手机处于纵向模式并且我将其旋转为横向,则正在使用的布局仍然是纵向布局。 我find了解决方案,建议在Activity的onConfigurationChanged(…)调用setContentView(…)并重新onConfigurationChanged(…)片段中的视图,但这似乎是一个相当麻烦的解决方案,因为它不仅仅是一个简单的内容设置我需要,片段需要保留(例如在RecyclerView滚动位置)。 内置的setRetainInstance(true)在这种情况下不起作用,因为视图将使用它重新创建,但是在调用onCreateView(…)时配置仍然是旧的。 如果我可以捕获configChanges事件,如果用户仅在该屏幕(片段)上但在其他任何地方保留Activity娱乐,那将是很好的。 不建议使用更多活动,由于UI / UX原因,我无法为此屏幕和应用程序的其余部分使用单独的活动。

如何在不重新创建布局的情况下旋转方向更改视图?

这个问题在此之前已被提出,但其答案是错误的。 我想在屏幕方向更改上旋转一些视图,但我想保持布局不变。 它们应根据当前方向旋转90度,180度,270度或360度( SCREEN_ORIENTATION_LANDSCAPE , SCREEN_ORIENTATION_PORTRAIT , SCREEN_ORIENTATION_REVERSE_LANDSCAPE , SCREEN_ORIENTATION_REVERSE_PORTRAIT )。 这就是我想要实现的目标: 我提到的链接中的答案表明我应该在layout-land创建一个新的不同布局。 显然,这不是我想要的。 我不想重新创建活动或更改布局方向。 我只想旋转一些视图,并保持其他视图在方向更改时保持不变。 旋转特定视图与更改或重新创建整个布局(方向更改)之间存在巨大差异。 使用此链接中的答案,我将能够使用此方法获取当前屏幕方向: public static int getScreenOrientation(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int rotation = windowManager.getDefaultDisplay().getRotation(); DisplayMetrics dm = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; int orientation; // if the device’s natural orientation […]

Android片段在方向更改时重新创建

我正在开发一个基本上有ActionBar的应用程序。 当我的应用程序启动时,Activity会创建片段并将它们附加到每个选项卡,因此当我切换时,我会得到不同的视图。 当我尝试旋转设备时出现问题。 经过一番努力,我注意到Android会自动重新创建以前添加的片段,如下所示: SummaryFragment.onCreate(Bundle) line: 79 FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795 FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032 FragmentManagerImpl.moveToState(int, boolean) line: 1014 FragmentManagerImpl.dispatchCreate() line: 1761 DashboardActivity(Activity).onCreate(Bundle) line: 864 … 然后像往常一样重新创建片段。 因此,我希望能够正常工作的“真实”片段和他们“隐藏”的Android创建的片段会让我的应用崩溃。 我怎样才能避免这种行为? 我已经尝试在SummaryFragment中调用setRetainInstance(false)。 谢谢

在两侧设置android的横向方向

我在2.2中的Android应用程序中工作,我想在landscape模式下设置我的应用程序。 为此,我在我的manifest添加了每个活动标签android:screenOrientation=”landscape” ,它运行正常。 但它只来自一方。 如果我再次颠倒设备,它将在landscape模式下适合相同的位置。 如何在设备的两侧都具有横向模式。 请帮帮我。 提前致谢。

最佳方式:在ScrollView中保存和恢复TextView位置

我想要的是,在设备更改方向时,屏幕中的顶线在纵向时仍然是横向屏幕上的顶行。 反之亦然。 由于纵向和横向之间的屏幕宽度可能不同,因此文本的线宽(也就是TextView和ScrollView的宽度)也会有所不同。 因此,在不同的屏幕配置(纵向与横向,大与小)中,换行将有所不同。 在不同的情况下,换行符将处于不同的位置。 有三种不太完美的解决方案供您参考。 还解释了它们的缺点。 首先,最基本的方法: (1)仅将y偏移存储在像素中 请查看: http : //eliasbland.wordpress.com/2011/07/28/how-to-save-the-position-of-a-scrollview-when-the-orientation-changes-in-android/ 为什么这不是那么完美: 在肖像中,线条被包裹。 Line_1_Word_A Line_1_Word_B Line_1_Word_C Line_1_Word_D Line_2_Word_A Line_2_Word_B Line_2_Word_C Line_2_Word_D Line_3_Word_A Line_3_Word_B Line_3_Word_C Line_3_Word_D 在横向,线条没有包裹。 Line_1_Word_A Line_1_Word_B Line_1_Word_C Line_1_Word_D Line_2_Word_A Line_2_Word_B Line_2_Word_C Line_2_Word_D Line_3_Word_A Line_3_Word_B Line_3_Word_C Line_3_Word_D 想象一下,在保存时在Portrait中读取Line_2_Word_A (在屏幕顶部)。 当更改为横向时,它将显示Line_3_Word_A (在屏幕顶部)。 (因为顶部有两行偏移的像素。) 然后我想出一个方法, (2)通过保存滚动百分比 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); final […]

为什么`android:screenOrientation =“背后”`在android 4.1.2中没有效果?

作为测试样本,应用程序有2个活动:MainActivity在按钮单击时启动SecondActivity。 它在Android 4.0.4上工作正常,但在Android 4.1.2上我遇到了意外行为。 系统设置中的AutoRotation已关闭(或打开 – 无关紧要,无论如何都会忽略“后面”选项)。 android:screenOrientation=”landscape”是为MainActivity设置的,而android:screenOrientation=”behind”是为SecondActivity设置的,这意味着SecondActivity也必须以横向方式启动。 适用于Android 4.0.4,但在Android 4.1.2上,SecondActivity以纵向方向开始。 AndroidManifest.xml中: SecondActivity.java: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); logOrientation(“onCreate”); } @Override protected void onDestroy() { super.onDestroy(); logOrientation(“onDestroy”); } @Override protected void onResume() { super.onResume(); logOrientation(“onResume”); } private void logOrientation(String prefix) { int requestedOrientation = this.getRequestedOrientation(); WindowManager lWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Configuration cfg […]

在方向更改中保留列表片段中的列表

我有一个使用片段的应用程序,所有这些都包含在一个活动中。 活动以包含按钮菜单的片段开始,所有这些按钮都会导致各种listfragments替换原始按钮/菜单片段。 我的问题是,在方向更改时,如果活动正在显示其中一个列表视图,它将消失并返回按钮菜单。 我理解为什么会发生这种情况……活动被破坏并重新创建,但不是如何解决它并通过方向更改维护列表视图/当前片段。 我在这里find了setRetainInstance和使用示例,但是我无法弄清楚如何将它应用于我的情况下使用按钮菜单或者我想要保留的片段可能是几个不同的片段之一。 下面是简化的代码,以显示主要活动和一个listfragments。 任何指向添加内容的指针都将非常感激,以便保留列表片段。 活动 public class Main extends FragmentActivity { private MainMenuFragment menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); menu = new MainMenuFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit(); } } ListFragment public class ItemListFragment extends ListFragment { private TextView header; private TextView empty; private Button add; public static Cursor itemCursor; private GroceryDB […]

自动片段还原的工作原理

使用FragmentActivity它会自动恢复片段状态并重新创建所有片段。 我知道这主要是在onSaveInstanceState保存状态,然后在activity的onCreate恢复。 看一下代码,我看到所有片段都被重新创建(或者只有在retainInstance为真时才附加)并添加到FragmentManager但我不清楚它们以哪种方式添加到视图中,因为视图不是自动恢复。 我最初的问题是我得到了一些类似于其他问题的片段的重复。 我在onCreate上: Fragment f = fm.findFragmentByTag(tagName); if(f==null) { f = createFragment(); fm.beginTransaction().add(R.id.myContainer,f,tagName).commit(); } else { //Nothing it’s on the view } 现在它可以工作,但我仍然不完全理解它是如何工作的。 我的怀疑是: 在哪一刻以及片段如何附加到视图? 我已经尝试过片段恢复是在onCreate of FragmentActivity 。 但是如果我之后调用setContentView ,片段如何附加到视图? 我可以在不覆盖onSaveInstanceState情况下阻止片段重新创建吗? 因为由于具有不同数量的片段的不同方向布局,我的初衷是仅重新创建标记为保留的一个状态片段,而不恢复未标记为保留的其他视图片段。

Android – 在横向和纵向模式之间切换会使Intent失去价值

我正在使用Intents在我的Android应用程序中切换活动。 我将数据放入Intent以用于下一个活动。 当我在横向和纵向模式之间切换手机时,从意图传递的值将丢失,并且我得到NullPointerException。 有人可以告诉我什么可能是错的。 有很多代码可以完全发布。 但如果有人需要查看代码的特定部分,我可以在此处发布。 编辑 我解决了国家没有得救的问题。 但我面临的另一个问题是,在更改了方向后,屏幕上的所有按钮都不起作用。 按下按钮,我在LogCat中收到此警告 02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0 请帮忙。