CoordinatorLayout messing up setError popup position

时间秒杀一切 提交于 2019-11-30 13:50:54
18446744073709551615

What worked for me is an extra LinearLayout in activity_main.xml (yes, there):

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activityRoot"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.biptest.MainActivity">

    <!-- *** THIS ONE *** -->
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/appbar"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" /> <!-- FRAGMENT(S) INSIDE -->

    </LinearLayout>
    <!-- *** BUT LEAVE THE FAB ALONE *** -->

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_dialog_email"
    android:visibility="gone"
    />

</android.support.design.widget.CoordinatorLayout>

This also works around the layout bug that shows when you toggle visibility of a view in a fragment.

And the next problem is white-on-white error messages in the popup on Android 2.x (link)

I had the same problem. Testing a little bit the UI, I found that the problem appeared when the EditText widget gets the focus programatically to show the error, in my case calling .requestFocus(), but when focusing on the widget again manually the popup appeared correctly.

So my workaround was to delay the call to .requestFocus() in a Runnable (simulating a user clicking on the EditText widget).

Here is the code:

        if (mFocusView != null) mFocusView.clearFocus(); // clear current focus. Needed to simulate a new "manual" focus

        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                final Handler handler = new Handler();
                final boolean b = handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mFocusView.requestFocus(); // request focus
                    }
                }, 1); // only delay 1 milisecond
            }
        });

mFocusView is the current EditText view to show an error.

Depending on your use case you may need to handle the focus when the keyboard is dismissed, as it makes the popup appear in the wrong position again.

Don't know if this will solve your problem. Hope it helps while Google solves this problem.

This was an Android bug and it is now fixed.

Reference : https://code.google.com/p/android/issues/detail?id=193793

Actually, the problem is not the CoordinatorLayout, but AppBarLayout.ScrollingViewBehavior. As a simple workaround you can remove the line app:layout_behavior="@string/appbar_scrolling_view_behavior" and add android:layout_marginBottom="?attr/actionBarSize" to your nested view if you don't need nested scroll.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!