viewpager结合Fragment实现滑动效果
每个fragment里面有一个EditText,EditText里面是数据可以随着Fragment的切换携带过来
布局:
<?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"
android:background="#c5c5c5"
tools:context=".kmview.updatelogin.Login_Pwd_SmsActivity">
<LinearLayout
android:id="@+id/tilte_layout"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="50dp"
android:layout_marginRight="20dp"
android:background="@drawable/login_tltle_bg"
android:orientation="horizontal">
<TextView
android:id="@+id/first_tv"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_weight="1"
android:background="@drawable/secelct_title_bg"
android:gravity="center"
android:text="标题一"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/second_tv"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_weight="1"
android:gravity="center"
android:text="标题二"
android:textColor="@color/login_text_color"
android:textSize="14sp" />
</LinearLayout>
<android.support.v4.view.ViewPager
android:background="@color/white"
android:id="@+id/viewpage_vp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tilte_layout"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_marginRight="20dp" />
</RelativeLayout>
代码类:
使用Kotlin写的。ViewpagerAndindicatorActivity 是主要的类,KBaseKMActivity是我的基类,setKMListener是基类里设置监听的方法,initKMView是基类里设置布局的方法,
import android.support.v4.app.Fragment
import android.support.v4.view.ViewPager
import android.view.View
import android.widget.EditText
import android.widget.TextView
import com.gdth.koinpromu.R
import com.gdth.koinpromu.kmadapters.LoginFragmentAdapter
import com.gdth.koinpromu.kmbase.KBaseKMActivity
import com.gdth.koinpromu.kmview.updatelogin.fragment.Fragment1
import com.gdth.koinpromu.kmview.updatelogin.fragment.Fragment2
import com.gdth.koinpromu.kmview.updatelogin.fragment.LoginPwdFragment
import com.gdth.koinpromu.kmview.updatelogin.fragment.LoginSmsFragment
import kotlinx.android.synthetic.main.activity_viewpager_indicator.*
import kotlinx.android.synthetic.main.pickerview_time.*
/**
*Created by Lyq
*on 2020-06-11
*/
class ViewpagerAndindicatorActivity : KBaseKMActivity(), View.OnClickListener {
var fragmentList = ArrayList<Fragment>()
var firstFragment = Fragment1()
var seconndFragment = Fragment2()
override fun setKMListener() {
first_tv.setOnClickListener(this)
second_tv.setOnClickListener(this)
}
override fun initKMData() {
}
override fun getKMLayout(): Int {
return R.layout.activity_viewpager_indicator
}
override fun loadKMData() {
}
override fun initKMView() {
//add fragment
fragmentList?.add(firstFragment)
fragmentList?.add(seconndFragment)
var logLoginFragmentAdapter = LoginFragmentAdapter(supportFragmentManager, fragmentList)
viewpage_vp.adapter = logLoginFragmentAdapter
//viewPager切换,上方标题也跟着切换
viewpage_vp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(p0: Int) {
}
override fun onPageScrolled(p0: Int, p1: Float, p2: Int) {
}
override fun onPageSelected(p0: Int) {
when (p0) {
0 -> {
first_tv.background = resources.getDrawable(R.drawable.secelct_title_bg)
second_tv.background = null
second_tv.setTextColor(resources.getColor(R.color.login_text_color))
first_tv.setTextColor(resources.getColor(R.color.white))
val phone_number_et = fragmentList.get(0).view?.findViewById<EditText>(R.id.phone_number_et)
phone_number_et?.setText("")
//通过回调设置要显示页面的输入框文本
seconndFragment.getTv(object : Fragment2.CallBack {
override fun getText(msg: String?) {
phone_number_et?.setText(msg)
}
})
//控制光标显示在输入框内容最后
phone_number_et?.setSelection(phone_number_et.text.length)
}
1 -> {
second_tv.background = resources.getDrawable(R.drawable.secelct_title_bg)
first_tv.background = null
first_tv.setTextColor(resources.getColor(R.color.login_text_color))
second_tv.setTextColor(resources.getColor(R.color.white))
val input_code_tv = fragmentList.get(1).view?.findViewById<EditText>(R.id.input_code_tv)
//通过回调设置要显示页面的输入框文本
firstFragment.getTv(object : Fragment1.CallBack {
override fun getText(msg: String?) {
input_code_tv?.setText(msg)
}
})
input_code_tv?.setSelection(input_code_tv.text.length)
}
}
}
})
}
override fun onClick(v: View?) {
when (v?.id) {
//点击标题,下方viewpager跟随变化
R.id.first_tv -> {
viewpage_vp.currentItem = 0
first_tv.background = resources.getDrawable(R.drawable.secelct_title_bg)
second_tv.background = null
second_tv.setTextColor(resources.getColor(R.color.login_text_color))
first_tv.setTextColor(resources.getColor(R.color.white))
}
R.id.second_tv -> {
viewpage_vp.currentItem = 1
second_tv.background = resources.getDrawable(R.drawable.secelct_title_bg)
first_tv.background = null
first_tv.setTextColor(resources.getColor(R.color.login_text_color))
second_tv.setTextColor(resources.getColor(R.color.white))
}
}
}
}
Fragment1里面主要方法:
//接口给外部用
fun getTv(c: CallBack) {
c.getText(edit1.getText().toString())
}
//声明回调接口
interface CallBack {
fun getText(msg: String?)
}
Fragment2里面主要方法:
fun getTv(c: CallBack) {
c.getText(edit2.getText().toString())
}
//声明回调接口
interface CallBack {
fun getText(msg: String?)
}
LoginFragmentAdapter
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
class LoginFragmentAdapter(fm: FragmentManager?, var loginList: ArrayList<Fragment>? = null) : FragmentPagerAdapter(fm) {
override fun getItem(i: Int): Fragment? {
return loginList?.get(i)
}
override fun getCount(): Int {
return loginList?.size!!
}
}