旋转后如何正确还原视图状态

亚尔

我正在尝试手动处理复杂视图的旋转,包括恢复适当的位置和大小。目前,我正在尝试这样做onLayout(更好的想法是很受欢迎的)。有时效果很好,但通常第一个旋转是放错位置或在没有孩子的情况下绘制视图。

private int oldOrientation = -1;

  /**
   * Override method to configure the dragged view and secondView layout properly.
   */
  @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    Log.e("mylayout", "onLayout " + df.format(new Date(Calendar.getInstance().getTimeInMillis())));
    if (isInEditMode()) {
      super.onLayout(changed, left, top, right, bottom);
    } else {
      dragView.setVisibility(INVISIBLE);
      if (isDragViewAtTop() && (oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) {
        dragView.layout(left, top, right, transformer.getOriginalHeight());
        secondView.layout(left, transformer.getOriginalHeight(), right, bottom);
        ViewHelper.setY(dragView, top);
        ViewHelper.setY(secondView, transformer.getOriginalHeight());
        ViewHelper.setX(dragView, left);
        ViewHelper.setX(secondView, left);
        oldOrientation = getResources().getConfiguration().orientation;
      } else if (isClosedAtLeft() && (
          oldOrientation != getResources().getConfiguration().orientation
              || oldOrientation == -1)) {
        dragView.layout(left, top, right, transformer.getOriginalHeight());
        secondView.layout(left, transformer.getOriginalHeight(), right, bottom);
        ViewHelper.setY(dragView, top);
        ViewHelper.setY(secondView, transformer.getOriginalHeight());
        ViewHelper.setX(dragView, left);
        ViewHelper.setX(secondView, left);
        closeToLeft();
        oldOrientation = getResources().getConfiguration().orientation;
      } else if (isClosedAtRight() && (
          oldOrientation != getResources().getConfiguration().orientation
              || oldOrientation == -1)) {
        dragView.layout(left, top, right, transformer.getOriginalHeight());
        secondView.layout(left, transformer.getOriginalHeight(), right, bottom);
        ViewHelper.setY(dragView, top);
        ViewHelper.setY(secondView, transformer.getOriginalHeight());
        ViewHelper.setX(dragView, left);
        ViewHelper.setX(secondView, left);
        closeToRight();
        oldOrientation = getResources().getConfiguration().orientation;
      } else if ((oldOrientation != getResources().getConfiguration().orientation
          || oldOrientation == -1)) {
        dragView.layout(left, top, right, transformer.getOriginalHeight());
        secondView.layout(left, transformer.getOriginalHeight(), right, bottom);
        ViewHelper.setY(dragView, top);
        ViewHelper.setY(secondView, transformer.getOriginalHeight());
        ViewHelper.setX(dragView, left);
        ViewHelper.setX(secondView, left);
        smoothSlideTo(SLIDE_BOTTOM);
        oldOrientation = getResources().getConfiguration().orientation;
      }
      dragView.setVisibility(VISIBLE);
    }
  }

在这段代码中,我尝试在旋转后恢复初始的stte,当调用onLayout并将其移动到适当的位置时,视图是在旋转之前的(有4种状态,从屏幕左移,从屏幕右移,屏幕顶部或右下角)。

编辑:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="com.github.pedrovgs.sample"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minSdkVersion="8" />

    <!-- Permissions -->

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- Application configuration -->

    <application
        android:name=".DraggablePanelApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <!-- Maps API KEY -->

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyC1rMU-mkhoyTvBIdTnYU0dss0tU9vtK48" />

        <!-- Main Activity -->

        <activity
            android:name=".activity.MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Places sample -->

        <activity
            android:name=".activity.PlacesSampleActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"

            android:label="@string/places_sample_activity_title" />

        <!-- TV Shows sample -->

        <activity
            android:name=".activity.TvShowsActivity"
            android:label="@string/tv_shows_sample_activity_title" />


        <!-- Youtube Sample -->

        <activity
            android:name=".activity.YoutubeSampleActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"

            android:label="@string/youtube_sample_activity_title" />


        <!-- Video Sample -->

        <activity
            android:name=".activity.VideoSampleActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"

            android:label="@string/video_sample_activity_title" />

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    </application>

</manifest>

样本活动xml

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:draggable_panel="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fl_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <!-- Movie Thumbnail -->

  <ImageView
      android:id="@+id/iv_thumbnail"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      style="@style/image_view"/>

  <!-- DraggablePanel -->

  <com.github.pedrovgs.DraggablePanel
      android:id="@+id/draggable_panel"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      draggable_panel:x_scale_factor="@dimen/x_scale_factor"
      draggable_panel:y_scale_factor="@dimen/y_scale_factor"
      draggable_panel:top_fragment_height="@dimen/top_fragment_height"
      draggable_panel:top_fragment_margin_right="@dimen/top_fragment_margin"
      draggable_panel:top_fragment_margin_bottom="@dimen/top_fragment_margin"
      draggable_panel:enable_horizontal_alpha_effect="false"/>

</FrameLayout>
亨利

您纷纷伸出ViewGroup来代替View,但还没有添加任何childDraggableView在XML或代码。我在中看不到任何addChild儿童相关的代码DraggableView您曾经使用过topFragmentbottomFragment等等。并且您曾经addFragmentToView()在中进行过片段交易ViewGroup馊主意!

我知道这既困难又费时。但是您需要退后一步,考虑一下此视图的设计。我强烈建议您将这些topFragment等作为孩子对待DraggableView,而不要FragmentManager在此视图中执行addTransaction

一旦开始将碎片作为孩子添加到您的碎片中ViewGroup,许多复杂性就会消失。我说这是根据我过去的经验。onLayout()用于安排Child Views内部ViewGroup旋转设备后,onLayout()将再次调用该设备,并根据需要排列子视图。这将非常简单。一旦开始这样的概念化,拖动操作将变得非常简单。

如果您认为在Framgents中生小孩ViewGroup是荒谬的,请查看此处ViewPager代码这使用片段作为输入,但仍将它们视为布局的子代。

  1. 尝试处理与位置onLayout()本身相关的所有内容
  2. 不要在中保存位置数据onSaveInstanceState()仅在其中保存textdrawable数据。
  3. 始终建议不要覆盖onCofigurationChanged()

您可能现在无法执行此操作,但是从长远来看,您可能想要重构并以这种方式执行。

记住onLayout()

当此视图应为其每个子级分配大小和位置时从布局调用。有子级的派生类应重写此方法,并在每个子级上调用布局。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带匕首的 Moxy 在旋转后不保存视图状态

来自分类Dev

旋转后如何获得超级视图的帧?

来自分类Dev

UIViewController被解雇后如何保存和还原每个UISwitch状态

来自分类Dev

如何在UINavigationController中正确旋转视图控制器?

来自分类Dev

如何在Android上向正确的方向移动旋转的视图?

来自分类Dev

iOS状态还原和UINavigationController模态视图

来自分类Dev

旋转设备后更新视图

来自分类Dev

旋转设备后更新视图

来自分类Dev

如何还原“等待上传”状态

来自分类Dev

从备份还原Debian后如何还原GRUB?

来自分类Dev

如何以正确的方式处理Android开发中的视图状态

来自分类Dev

如何正确使用嵌套状态和视图?

来自分类Dev

VSPackage无法正确加载;如何还原“继续显示此错误消息”状态?

来自分类Dev

从vscode调试启动时,如何使Firefox正确还原其状态?

来自分类Dev

全新安装后如何将PostgreSQL数据库还原到初始状态

来自分类Dev

全新安装后如何将PostgreSQL数据库还原到初始状态

来自分类Dev

如何正确还原FMX表单?

来自分类Dev

屏幕旋转时的片段视图状态

来自分类Dev

表格视图无法正确调整方向旋转

来自分类Dev

屏幕旋转后保存片段状态

来自分类Dev

带片段旋转后无法修改视图

来自分类Dev

Android动画可旋转视图并在旋转后将其冻结

来自分类Dev

使用核心动画后如何获取视图的当前旋转?

来自分类Dev

如何在 Xcode、Swift3 中循环旋转 UIImage 后显示弹出视图?

来自分类Dev

MVVM应用程序无法正确还原状态

来自分类Dev

MVVM应用程序无法正确还原状态

来自分类Dev

重新启动后如何保持JMSserver并将其还原到上一个已知状态

来自分类Dev

ClearCase:如何还原快照视图中的更改?

来自分类Dev

ClearCase:如何还原快照视图中的更改?

Related 相关文章

  1. 1

    带匕首的 Moxy 在旋转后不保存视图状态

  2. 2

    旋转后如何获得超级视图的帧?

  3. 3

    UIViewController被解雇后如何保存和还原每个UISwitch状态

  4. 4

    如何在UINavigationController中正确旋转视图控制器?

  5. 5

    如何在Android上向正确的方向移动旋转的视图?

  6. 6

    iOS状态还原和UINavigationController模态视图

  7. 7

    旋转设备后更新视图

  8. 8

    旋转设备后更新视图

  9. 9

    如何还原“等待上传”状态

  10. 10

    从备份还原Debian后如何还原GRUB?

  11. 11

    如何以正确的方式处理Android开发中的视图状态

  12. 12

    如何正确使用嵌套状态和视图?

  13. 13

    VSPackage无法正确加载;如何还原“继续显示此错误消息”状态?

  14. 14

    从vscode调试启动时,如何使Firefox正确还原其状态?

  15. 15

    全新安装后如何将PostgreSQL数据库还原到初始状态

  16. 16

    全新安装后如何将PostgreSQL数据库还原到初始状态

  17. 17

    如何正确还原FMX表单?

  18. 18

    屏幕旋转时的片段视图状态

  19. 19

    表格视图无法正确调整方向旋转

  20. 20

    屏幕旋转后保存片段状态

  21. 21

    带片段旋转后无法修改视图

  22. 22

    Android动画可旋转视图并在旋转后将其冻结

  23. 23

    使用核心动画后如何获取视图的当前旋转?

  24. 24

    如何在 Xcode、Swift3 中循环旋转 UIImage 后显示弹出视图?

  25. 25

    MVVM应用程序无法正确还原状态

  26. 26

    MVVM应用程序无法正确还原状态

  27. 27

    重新启动后如何保持JMSserver并将其还原到上一个已知状态

  28. 28

    ClearCase:如何还原快照视图中的更改?

  29. 29

    ClearCase:如何还原快照视图中的更改?

热门标签

归档