我正在尝试复制Android市场中最新YouTube应用的功能.观看视频时,有两个独立的布局,一个是纵向提供额外的信息,一个是横向,提供视频的全屏视图.

YouTupe应用程序处于纵向模式

横向模式的YouTube应用
(抱歉照片的随机性,但它们是我能找到的第一个实际布局照片)
这通常很容易做到 - 只需在layout-land中指定一个替代布局,一切都会很好.YouTube应用程序的功能非常好(以及我想要复制的内容)是在方向更改时,视频会继续播放,而不必从头开始重新缓冲.
我已经发现,覆盖onConfigurationChange()并设置新的LayoutParameters将允许我在不强制拒绝的情况下调整视频大小 - 但是当多次旋转屏幕时,视频会随机缩放到不同的宽度/高度.我已尝试在VideoView上进行各种invalidate()调用,尝试在父RelativeLayout容器上调用RequestLayout()并尝试尽可能多的不同内容,但我似乎无法让它正常工作.任何建议将不胜感激!
这是我的代码:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
questionText.setVisibility(View.GONE);
respond.setVisibility(View.GONE);
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
} else {
questionText.setVisibility(View.VISIBLE);
respond.setVisibility(View.VISIBLE);
Resources r = getResources();
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在logcat中发现了一些有趣的输出,当我的视频旋转时出现这似乎是罪魁祸首 - 虽然我不知道如何解决它:
正确调整大小时的Logcat输出(占用整个窗口)
注意h = 726
12-13 15:37:35.468 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561 1262 1268 I …Run Code Online (Sandbox Code Playgroud) 我有一个纵向模式的相机应用程序,它从前端和后端相机拍摄照片.我将图像保存在我的SD卡中并尝试找到相应的exif值,它总是给出0.但是我得到了预期的exif方向存储在设备中的其他图像的值(如下载的图片).
我怎样才能解决这个问题 ?谁能帮我吗 ?
这是用于保存图片和查找方向的代码
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
try {
File APP_FILE_PATH = new File(Environment.getExternalStorageDirectory()
.getPath() + "/Myapp/");
if (!APP_FILE_PATH.exists()) {
APP_FILE_PATH.mkdirs();
}
File file = new File(APP_FILE_PATH, "image.jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(arg0);
fos.close();
imageFileUri=Uri.fromfile(file); getApplicationContext().getContentResolver().notifyChange(
imageFileUri, null);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
ExifInterface exif = new ExifInterface(file.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
} catch (Exception e) {
}
}
};
Run Code Online (Sandbox Code Playgroud)
以下是surphace创建和更改函数的代码 …
当我尝试切换模拟器的方向时,模拟器窗口旋转,模拟器屏幕的方向保持原样.任何人都可以告诉我这是什么原因?我已经尝试了StackOverflow的所有答案,似乎没有任何帮助

我的应用程序有一个Activity,其中包含一个带有四个片段的FragmentPagerAdapter(使用ViewPagerIndicator库).其中一个片段设计了单独的纵向和横向布局,其他三个不需要并且需要固定为纵向.
我的想法是设置android:configChanges="orientation"在清单中,并呼吁getActivity().setRequestedScreenOrientation()在onResume()所有的碎片,锁定到SCREEN_ORIENTATION_PORTRAIT在他们三个,而是SCREEN_ORIENTATION_UNSPECIFIED在需要允许旋转的一个,但这不起作用.该应用程序仍处于纵向模式.
有没有办法实现这个目标?
实际活动实际上不需要旋转,如果无论如何都允许片段在没有活动的情况下改变方向,但我没有发现任何提及这是可能的.如果活动旋转也同样可以,因为标签栏在横向时将被隐藏.
android android-layout android-fragments android-orientation android-viewpager
setRetainInstance上的文档说:
这只能用于不在后栈中的片段.
所以我开始玩它.
我有一个Activity添加第一个frag A
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, new PackageFragment());
ft.commit
Run Code Online (Sandbox Code Playgroud)
然后从这个frag我运行一个父Activity的方法,它将frag B添加到backstack
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, new OrderFragment());
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
然后我从onCreate,onDestroy,onSaveInstanceState,onActivityCreated ......等创建log msg
我尝试了这个过程的两个版本.在每个片段上旋转设备.
一切都如预期.onCreate,onDestroy on fragment fire
一切都如预期的那样?onCreate,onDestroy片段不要开火
当片段都在后台时,一切似乎都有效..所以为什么文档说我不应该使用它?我可能遇到麻烦的情况是什么?
谢谢
Android提供旋转矢量传感器和方向传感器.我知道它们会返回不同的数据,因为对于矢量传感器,我们有角度,在方向传感器中我们有角度.但是概念上的区别是什么?我从文档中无法理解.哪一个提供了三维空间中设备的方向?我糊涂了!
我正在使用Intents在我的Android应用程序中切换活动.我将数据放入Intent以用于下一个活动.当我在横向和纵向模式之间切换手机时,从意图传递的值将丢失,我得到NullPointerException.
有人可以告诉我可能有什么问题.
有很多代码可以完全发布.但如果有人需要查看代码的特定部分,我可以在此处发布.
编辑
我解决了状态未被保存的问题.但我遇到的另一个问题是,在方向改变后屏幕上没有任何按钮工作.按下按钮,我在LogCat中收到此警告
02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
Run Code Online (Sandbox Code Playgroud)
请帮忙.
作为测试样本,应用程序有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中:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.my.example.testbehindorientation.MainActivity"
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>
<activity
android:name="com.my.example.testbehindorientation.SecondActivity"
android:configChanges="screenSize|orientation"
android:label="@string/title_activity_second"
android:screenOrientation="behind" >
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
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 = …Run Code Online (Sandbox Code Playgroud) android orientation screen-orientation android-orientation android-activity
使用FragmentActivity它时会自动恢复片段状态并重新创建所有片段.
我知道这主要是为了保存状态onSaveInstanceState,然后在活动中恢复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
}
Run Code Online (Sandbox Code Playgroud)
现在它有效,但我仍然不完全理解它是如何工作的.
我的怀疑是:
onCreate的FragmentActivity.但是如果我setContentView在那之后打电话,片段如何附加到视图?onSaveInstanceState吗 因为由于具有不同数量的片段的不同方向布局,我的初衷是仅重新创建标记为保留的一个状态片段,而不恢复未标记为保留的其他视图片段.我有一个使用片段的应用程序,所有这些片段都包含在一个活动中.活动以包含按钮菜单的片段开始,所有这些按钮都会导致各种listfragments替换原始按钮/菜单片段.
我的问题是,在方向更改时,如果活动正在显示其中一个列表视图,它将消失并返回按钮菜单.我理解为什么会发生这种情况......活动被破坏并重新创建,但不是如何解决它并通过方向更改维护列表视图/当前片段.
我已经找到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();
}
}
Run Code Online (Sandbox Code Playgroud)
ListFragment
public class ItemListFragment extends ListFragment {
private TextView header;
private TextView empty;
private Button add;
public static Cursor itemCursor;
private GroceryDB mDbHelper;
public static long mRowId;
public static CheckCursorAdapter lists;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.common_list, …Run Code Online (Sandbox Code Playgroud) android android-listview android-fragments android-orientation