当方向改变时,ViewPager会破坏片段

时间:2017-10-25 17:10:45

标签: android android-layout android-fragments

我目前正在尝试理解为什么当屏幕方向从纵向变为横向时,viewpager会破坏片段。

这是 ViewPagerAdapter.kt

internal class FragmentPagerAdapter(fm: FragmentManager, private val mNumbOfTabs: Int) : FragmentPagerAdapter(fm) {

    /**
     * return the fragment for each position
     */
    override fun getItem(position: Int): Fragment? {
        when (position) {
            SIGN_UP -> return SignUpFragment()
            LOGIN -> return LoginFragment()
            else -> return null
        }
    }

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val ret = super.instantiateItem(container, position)
        return ret
    }

    /**
     * return number of tabs
     */
    override fun getCount(): Int {
        return mNumbOfTabs
    }

    companion object {
        private val SIGN_UP = 0
        private val LOGIN = 1
    }
}

以及我如何从MainActivity调用它

Handler().postDelayed({
                fadeOutAndHideImage(imagelogo);
                tabs.addTab(tabs.newTab().setIcon(R.drawable.sign_in).setText(R.string.sign_up))
                tabs.addTab(tabs.newTab().setIcon(R.drawable.sign_in).setText(R.string.login))
                val adapter = FragmentPagerAdapter(supportFragmentManager, tabs.getTabCount())
                viewpager.setAdapter(adapter)
                viewpager.setOffscreenPageLimit(2)
                viewpager.addOnPageChangeListener(TabLayoutOnPageChangeListener(tabs))
                tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
                    override fun onTabSelected(tab: TabLayout.Tab) {
                        // Hide keyboard
                        (getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(viewpager.getWindowToken(), 0)
                        viewpager.setCurrentItem(tab.position)
                    }

                    override fun onTabUnselected(tab: TabLayout.Tab) {

                    }

                    override fun onTabReselected(tab: TabLayout.Tab) {

                    }
                })
            }, 5000)

屏幕在风景中很顺利,但是当我改变为肖像时......我认为图像是自己说话的。一些类似的问题说了保留片段。

这是bitbucket中应用的链接:https://Crdzbird@bitbucket.org/unidevelop/healthy-app.git

Fragment + ViewPager fail when orientation change

Android ViewPager orientation change

ViewPager fragments disappear when change screen rotation

但结果却不同:(

Landscape

Portrait

[[EDITED]]

SplashLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context="com.freelance.nicaragua_dev.healthyapp.UI.SplashActivity">

    <com.freelance.nicaragua_dev.healthyapp.Helper.Kenburns.KenBurnsView
        android:id="@+id/ken_burns_images"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"/>

    <ImageView
        android:id="@+id/imagelogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:src="@drawable/logo" />

    <com.freelance.nicaragua_dev.healthyapp.Helper.Kenburns.KenBurnsView
        android:id="@+id/welcome_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:alpha="0.0"
        android:text="@string/app_name"
        android:textColor="@color/material_petal"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="24dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal">
    </LinearLayout>

    <android.support.v7.widget.CardView
        android:id="@+id/cardViewPrincipal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="150dp"
        android:layout_marginLeft="16dp"
        android:layout_centerInParent="true"
        android:layout_marginRight="16dp"
        android:layout_marginTop="80dp"
        app:cardCornerRadius="7dp"
        app:cardElevation="22dp"
        android:background="@color/transparent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                app:tabGravity="fill"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                app:tabIndicatorHeight="4dp" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />
        </LinearLayout>


    </android.support.v7.widget.CardView>

</RelativeLayout>

SignUp.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".UI.SignUpFragment">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:fillViewport="true"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/et_email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:layout_marginRight="20dp"
                    android:cursorVisible="true"
                    android:gravity="center|left|bottom"
                    android:hint="@string/email"
                    android:inputType="textEmailAddress"
                    android:maxLength="50"
                    android:paddingBottom="10dp"
                    android:textColor="@color/md_black_1000"
                    android:textSize="18sp" />

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

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/password"
                app:passwordToggleEnabled="true">

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/et_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:layout_marginRight="20dp"
                    android:layout_marginTop="30dp"
                    android:cursorVisible="true"
                    android:gravity="center|left|bottom"
                    android:inputType="textPassword"
                    android:maxLength="50"
                    android:paddingBottom="10dp"
                    android:textColor="@color/md_black_1000"
                    android:textSize="18sp" />

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

            <Button
                android:id="@+id/buttonLogin"
                android:text="@string/sign_up"
                android:layout_gravity="center"
                android:layout_margin="15dp"
                android:padding="10dp"
                android:layout_marginRight="5dp"
                android:layout_width="150dp"
                android:layout_height="50dp"
                android:background="@drawable/red_button"
                android:textColor="@color/md_red_600" />

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

</FrameLayout>

2 个答案:

答案 0 :(得分:1)

问题在于您的activity_splash.xml布局。 cardViewPrincipal的底部边距为150dp,上边距为80dp。减少这些值,因为大多数屏幕没有足够的空间来获得如此高的利润率。第二个原因是您已将viewpager设置为权重为1而不是仅仅匹配其父级。 奖金(完全与您的问题无关) 您还应该使用FrameLayout替换RelativeLayout,因为它是昂贵的。您应该避免使用它,因为它会降低帧速率。

你的xml应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context="com.freelance.nicaragua_dev.healthyapp.UI.SplashActivity">

    <com.freelance.nicaragua_dev.healthyapp.Helper.Kenburns.KenBurnsView
        android:id="@+id/ken_burns_images"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"/>

    <ImageView
        android:id="@+id/imagelogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|center"
        android:layout_marginTop="10dp"
        android:src="@drawable/logo" />

    <com.freelance.nicaragua_dev.healthyapp.Helper.Kenburns.KenBurnsView
        android:id="@+id/welcome_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:alpha="0.0"
        android:text="@string/app_name"
        android:textColor="@color/material_petal"
        android:layout_gravity="bottom|center"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       android:layout_gravity="bottom|center"
        android:layout_marginBottom="24dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <!--<Button-->
            <!--android:id="@+id/buttonSignup"-->
            <!--android:text="@string/sign_up"-->
            <!--android:layout_marginLeft="5dp"-->
            <!--android:layout_width="150dp"-->
            <!--android:layout_height="50dp"-->
            <!--android:background="@drawable/red_button"-->
            <!--android:textColor="@android:color/white" />-->
    </LinearLayout>

    <android.support.v7.widget.CardView
        android:id="@+id/cardViewPrincipal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginTop="32dp"
        android:layout_gravity="top"
        app:cardCornerRadius="7dp"
        app:cardElevation="22dp"
        android:background="@color/transparent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                app:tabGravity="fill"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/white"
                app:tabIndicatorHeight="4dp" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>


    </android.support.v7.widget.CardView>

</FrameLayout>

答案 1 :(得分:0)

由于您在纵向模式和横向模式下使用相同的布局,因此您可以修改AndroidManifest.xml,并将此行添加到您不想重绘的Activity

android:configChanges="keyboardHidden|orientation"

https://developer.android.com/guide/topics/resources/runtime-changes.html

  

现在,当其中一个配置发生变化时,MyActivity不会   重新开始。相反,MyActivity接到一个电话   onConfigurationChanged()。

在这种情况下,或许那就是你要找的东西。

或者,您可以清除传递给Bundle的{​​{1}},因为此对象可能包含onCreate()可能以错误方式使用的某些数据。