getLocationOnScreen在旋转后返回旧位置

时间:2015-06-19 11:02:44

标签: android android-dialogfragment

我有什么:

  • android:configChanges="orientation|screenSize|keyboardHidden"
  • 的活动
  • 上面的DialogFragment
  • DialogFragment上的ViewA

问题是什么:

我使用ViewA.getLocationOnScreen获取视图屏幕上的位置。当我第一次打开对话框时,位置是正确的。旋转屏幕后,由于android:configChanges视图以某种方式不更新它的位置,即使对话框在活动中正确居中,ViewA的getLocationOnScreen也会指向较旧的位置,之前轮换。

我尝试过的事情。

我覆盖了对话框的onConfigurationChanged并尝试了这个:

  • ViewA.requestLayout(不做任何事)
  • ViewA.getViewTreeObserver().addOnGlobalLayoutListener并在onGlobalLayout上将topMargin设置为1并再次调用requestLayout。 (这有效,但我不想在每次旋转屏幕时设置边距)

我想知道的是如何强制重新定位对话框,使得getLocationOnScreen在旋转后返回正确的值

请注意,我不想更改android:configChanges

2 个答案:

答案 0 :(得分:0)

要尝试解释一下,如果您有{!! Form::select('subkategori',$sktgr,['style'=>'width:100%','data-toggle'=>'sele‌​ct2']) !!} android:configChanges="orientation,则不会重新设置Activity,这意味着View将无法衡量,这就是旧职位的原因报告,也要求View你需要在DialogFrament的查看父母的电话上完整抽奖,以便为整个游戏DecorView - 致电invalidate()& ; requestLayout()

答案 1 :(得分:-1)

调用id | date | day difference 0 | 2015-05-02 00:00:00 | day 1 1 | 2015-05-05 00:00:00 | day 3 2 | 2015-05-22 00:00:00 | day 20 时,屏幕上的视图位置尚未更新。您需要在视图中添加onConfigurationChanged以捕获您正在寻找的更新。请参阅下面的示例。

<强> TestDialogFragment.java

OnLayoutChangeListener

<强> test_fragment.xml

public class TestDialogFragment extends DialogFragment {

    private static final String TAG = "TestDialogFragment";

    View testView;
    int[] testViewLocation = {0, 0};

    public TestDialogFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.test_fragment, container);
        testView = view.findViewById(R.id.test_view);
        testView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                Log.d(TAG, "onLayoutChange");
                testView.getLocationOnScreen(testViewLocation);
                Log.d(TAG, String.format("%s %s", testViewLocation[0], testViewLocation[1]));
            }
        });
        return view;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.d(TAG, "landscape");
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Log.d(TAG, "portrait");
        }

        testView.getLocationOnScreen(testViewLocation);
        Log.d(TAG, String.format("%s %s", testViewLocation[0], testViewLocation[1]));
    }

}

日志输出

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/test_view"
        android:layout_height="50dp"
        android:layout_width="match_parent"
        android:layout_gravity="center"/>

</FrameLayout>