我目前正在尝试理解为什么当屏幕方向从纵向变为横向时,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
但结果却不同:(
[[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>
答案 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()
可能以错误方式使用的某些数据。