在某些片段可见时启用显示方向更改,在其他片段时禁用

时间:2013-02-25 14:47:07

标签: android android-fragments

我在我的应用中使用片段。大多数碎片应该只有一个方向 - 肖像。所以我强迫持有人活动始终处于纵向模式。

但我的一个片段应该同时具有纵向和横向模式。如何只为一个片段启用方向更改?或者我需要将它作为一个单独的活动来处理方向而不依赖于其他片段?

5 个答案:

答案 0 :(得分:2)

您必须手动完成。

1)将此行添加到您的活动标签android:configChanges =“orientation | screenSize”

2)在你的fragmtn或activity

中覆盖配置更改回调
@Override
public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig); 

   if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }

//Your fragment animation layout changing code

}

答案 1 :(得分:2)

我知道这很旧,但我会加两分钱,以防它对某人有所帮助,因为它仍然是当前问题。

注意:这个答案在我发布的一天后被编辑,因为我发现 API 低于 26。经过大量测试,以下是我的最终答案。 此解决方案适用于(经过测试)API 21 及更高版本。

我的情况可能与发布的问题不同,所以我会说明我有什么,以及我是如何解决的。

  1. 一个 Activity 包含多个片段。
  2. 只有一个片段需要能够同时处于纵向和横向,因为它具有相应的不同布局版本。其余部分必须保持纵向,并且当应用处于前台时屏幕不得旋转。
  3. 我使用了 Kotlin。对于 Java 应该几乎相同。

在您拥有的每个片段中,您都需要覆盖 onResume()。 在其中,您指定要“强制”的方向。

在我的例子中,我只想在纵向和横向中显示一个片段,所以我设置了 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED(如果没有设置,这是默认值),但是因为我们将更改其余片段中的 requestedOrientation,所以我们也必须在此处设置它

    override fun onResume() {

    super.onResume()

    activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED

    //The rest of your code (if you have something else here).

    }

在其余的片段中,我想“强制”纵向,所以我使用了以下内容:

    override fun onResume() {

    super.onResume()

    activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

    //The rest of your code (if you have something else here).

    }

这就是让它工作所需的一切!以下是可选的,但可能对我有用。

可选 1:

如果您有很多片段并且不想在每个片段中修改/添加 onResume(),您可以创建一个子类(例如,PortraitFragment){{1 }} 您只需覆盖 Fragment()。然后,您可以派生您想要具有此功能的所有片段。

onResume()

可选 2:

根据您的布局,您可能还想添加它。
我使用它是因为我的布局没有为多窗口模式做好准备。

在清单中添加 open class PortraitFragment : Fragment() { override fun onResume() { super.onResume() activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } } :

android:resizeableActivity="false"

答案 2 :(得分:0)

我找到了解决这个问题的方法:

覆盖每个片段中的setUserVisibleHint()。

仅限肖像片段:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}

答案 3 :(得分:0)

在选择要显示的片段时,请使用setRequestedOrientation活动方法。

public class MyActivity extends Activity {
  // ...

  public void chooseFragment(int x) {
    Fragment newFragment;
    if (x == 1) {
      // FragmentOne can be any orientation
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
      newFragment = new FragmentOne();
    }
    else {
      // FragmentTwo can be only portrait orientation
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      newFragment = new FragmentTwo();
    }
    getSupportFragmentManager().beginTransaction()
      .replace(R.id.fragment_container, newFragment)
      .commit();
  }

  // ...
}

答案 4 :(得分:-2)

AndroidManifest.xml 中,在片段中添加 android:screenOrientation =“portrait”,您想修复为人像,不要在您不想修改方向的片段中添加此语句。示例:

<activity
android:name="com.example.myapp.MainActivity"
android:screenOrientation="portrait"/>