在某些Android应用程序中,使用了选项卡,该选项卡允许开发人员在单个活动中组合多个任务(操作)。另一方面,它为该应用程序提供了不同的外观。通过使用ViewPager,还可以提供左右滑动的不同感觉。并且要实现该主题,需要很少的术语,例如ViewPager ,Fragments和TabLayout 。出于实践目的,本文使用Kotlin编程语言。
什么是TabLayout,ViewPager和Fragment?
- TabLayout :此视图允许我们在android应用程序中使用多个选项卡。此布局包含不同的选项卡。在本文中,选项卡用于从一个片段导航到另一个片段。
- ViewPager :此视图使我们可以利用左右滑动功能来显示另一个片段。
- 片段:这是活动的一部分。要在单个活动上执行多个任务,此视图是必需的。片段还根据需要使用包含视图的布局文件。
下面的样本GIF给出得到什么我们将在本文中做的想法。
分步实施
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。
步骤2:建立片段
- 转到应用程序> res>布局>右键单击>新建>布局资源文件,然后询问文件名,然后提供“ layout_login ”作为该布局文件的名称。
- 使用相同的方法创建另一个布局文件“ layout_signup ”。
- 之后,对“ layout_login.xml ”文件使用以下代码。这里显示了一个TextView。
XML
XML
Kotlin
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
// Here ":" symbol is indicate that LoginFragment
// is child class of Fragment Class
class LoginFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.layout_login, container, false
)
}
// Here "layout_login" is a name of layout file
// created for LoginFragment
}
Kotlin
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
// Here ":" symbol is indicate that SignupFragment
// is child class of Fragment Class
class SignupFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.layout_signup, container, false
)
}
// Here "layout_signup" is a name of layout file
// created for SignFragment
}
XML
XML
XML
Kotlin
import android.os.Bundle
import androidx.annotation.Nullable
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Create the object of Toolbar, ViewPager and
// TabLayout and use “findViewById()” method*/
var tab_toolbar = findViewById(R.id.toolbar)
var tab_viewpager = findViewById(R.id.tab_viewpager)
var tab_tablayout = findViewById(R.id.tab_tablayout)
// As we set NoActionBar as theme to this activity
// so when we run this project then this activity doesn't
// show title. And for this reason, we need to run
// setSupportActionBar method
setSupportActionBar(tab_toolbar)
setupViewPager(tab_viewpager)
// If we dont use setupWithViewPager() method then
// tabs are not used or shown when activity opened
tab_tablayout.setupWithViewPager(tab_viewpager)
}
// This function is used to add items in arraylist and assign
// the adapter to view pager
private fun setupViewPager(viewpager: ViewPager) {
var adapter: ViewPagerAdapter = ViewPagerAdapter(supportFragmentManager)
// LoginFragment is the name of Fragment and the Login
// is a title of tab
adapter.addFragment(LoginFragment(), "Login")
adapter.addFragment(SignupFragment(), "Signup")
// setting adapter to view pager.
viewpager.setAdapter(adapter)
}
// This "ViewPagerAdapter" class overrides functions which are
// necessary to get information about which item is selected
// by user, what is title for selected item and so on.*/
class ViewPagerAdapter : FragmentPagerAdapter {
// objects of arraylist. One is of Fragment type and
// another one is of String type.*/
private final var fragmentList1: ArrayList = ArrayList()
private final var fragmentTitleList1: ArrayList = ArrayList()
// this is a secondary constructor of ViewPagerAdapter class.
public constructor(supportFragmentManager: FragmentManager)
: super(supportFragmentManager)
// returns which item is selected from arraylist of fragments.
override fun getItem(position: Int): Fragment {
return fragmentList1.get(position)
}
// returns which item is selected from arraylist of titles.
@Nullable
override fun getPageTitle(position: Int): CharSequence {
return fragmentTitleList1.get(position)
}
// returns the number of items present in arraylist.
override fun getCount(): Int {
return fragmentList1.size
}
// this function adds the fragment and title in 2 separate arraylist.
fun addFragment(fragment: Fragment, title: String) {
fragmentList1.add(fragment)
fragmentTitleList1.add(title)
}
}
}
- 以下是layout_signup.xml文件的代码。
XML格式
- 要创建Fragment类,请右键单击位于应用程序> Java >“ com.example.gfgtabdemo”中的第一个Java目录包,其中“ gfgtabdemo”是项目名(在小写情况下)。将光标移到“新建”上,然后选择“ Kotlin文件/类”。
- 为该文件命名“ LoginFragment ”,然后选择“ class ”选项,如下面的屏幕截图所示。
- 要创建Fragment ,必须使用“:”符号将该类作为Fragment类的子级。并重写“ onCreateView ”方法以将布局资源文件设置为该片段文件,如以下代码片段所示。
- 使用以上过程创建“ SignupFragment ”文件。
- 之后,在“ LoginFragment.kt ”文件中使用以下代码。
科特林
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
// Here ":" symbol is indicate that LoginFragment
// is child class of Fragment Class
class LoginFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.layout_login, container, false
)
}
// Here "layout_login" is a name of layout file
// created for LoginFragment
}
- 在“ SignupFragment.kt ”文件中使用以下代码。
科特林
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
// Here ":" symbol is indicate that SignupFragment
// is child class of Fragment Class
class SignupFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(
R.layout.layout_signup, container, false
)
}
// Here "layout_signup" is a name of layout file
// created for SignFragment
}
步骤3:主题配置
- 打开“styles.xml”,它被置于文件夹内“应用> RES>值> styles.xml”,如下图所示。
- 在styles.xml的
标记内添加以下代码。
XML格式
- 以下是完整的styles.xml文件的完整代码。
XML格式
- 打开后,将“ AndroidManifest.xml ”文件放在“ app> manifest> AndroidManifest.xml ”文件夹中。我们需要在
标签内设置主题“ @ style / AppTheme.NoActionBar ”。要执行相同的操作,请在以下屏幕截图中的活动标签内键入要使用选项卡布局的突出显示的行。
步骤4:添加所需的视图
对于本主题的实现,重要的是添加一些视图。要首先执行相同的操作,请打开位于“ Gradle脚本> build.gradle(Module:app) ”的build.gradle(Module:app)文件,然后在dependencies块内添加以下依赖项。并且不要忘记单击“立即同步”。要使用“ appbar布局”,必须具有这种依赖性。
implementation ‘com.google.android.material:material:1.2.0’
Note: Type this dependency line rather than copy and paste. Because due to copy and paste formatting or text style may be unaccepted if it is not matched with the required format.
步骤5:使用activity_main.xml文件
之后,有必要在活动的布局文件中添加以下视图,因此将其打开。在这里,我们使用“ activity_main.xml ”。
- AppBarLayout
- 工具栏
- 标签版式
- ViewPager
将以下代码添加到“ activity_main.xml ”文件中。在代码内部添加了注释,以更详细地了解代码。
XML格式
步骤6:使用MainActivity.kt文件
之后,打开“ MainActivity.kt ”。在此文件中,重要的是创建Toolbar,ViewPager和TabLayout的对象,并使用“ findViewById() ”方法标识视图。其语法如下所示。
var object_name = findViewById
转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。
科特林
import android.os.Bundle
import androidx.annotation.Nullable
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager.widget.ViewPager
import com.google.android.material.tabs.TabLayout
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Create the object of Toolbar, ViewPager and
// TabLayout and use “findViewById()” method*/
var tab_toolbar = findViewById(R.id.toolbar)
var tab_viewpager = findViewById(R.id.tab_viewpager)
var tab_tablayout = findViewById(R.id.tab_tablayout)
// As we set NoActionBar as theme to this activity
// so when we run this project then this activity doesn't
// show title. And for this reason, we need to run
// setSupportActionBar method
setSupportActionBar(tab_toolbar)
setupViewPager(tab_viewpager)
// If we dont use setupWithViewPager() method then
// tabs are not used or shown when activity opened
tab_tablayout.setupWithViewPager(tab_viewpager)
}
// This function is used to add items in arraylist and assign
// the adapter to view pager
private fun setupViewPager(viewpager: ViewPager) {
var adapter: ViewPagerAdapter = ViewPagerAdapter(supportFragmentManager)
// LoginFragment is the name of Fragment and the Login
// is a title of tab
adapter.addFragment(LoginFragment(), "Login")
adapter.addFragment(SignupFragment(), "Signup")
// setting adapter to view pager.
viewpager.setAdapter(adapter)
}
// This "ViewPagerAdapter" class overrides functions which are
// necessary to get information about which item is selected
// by user, what is title for selected item and so on.*/
class ViewPagerAdapter : FragmentPagerAdapter {
// objects of arraylist. One is of Fragment type and
// another one is of String type.*/
private final var fragmentList1: ArrayList = ArrayList()
private final var fragmentTitleList1: ArrayList = ArrayList()
// this is a secondary constructor of ViewPagerAdapter class.
public constructor(supportFragmentManager: FragmentManager)
: super(supportFragmentManager)
// returns which item is selected from arraylist of fragments.
override fun getItem(position: Int): Fragment {
return fragmentList1.get(position)
}
// returns which item is selected from arraylist of titles.
@Nullable
override fun getPageTitle(position: Int): CharSequence {
return fragmentTitleList1.get(position)
}
// returns the number of items present in arraylist.
override fun getCount(): Int {
return fragmentList1.size
}
// this function adds the fragment and title in 2 separate arraylist.
fun addFragment(fragment: Fragment, title: String) {
fragmentList1.add(fragment)
fragmentTitleList1.add(title)
}
}
}