【问题标题】:A fragment with 2 tabs without viewpager一个有 2 个标签的片段,没有 viewpager
【发布时间】:2019-06-24 07:45:52
【问题描述】:

[我的抽屉菜单的图像][1]我有一个带有导航抽屉和片段的应用程序。现在我希望一个片段里面有 2 个标签,每个标签都有另一个片段。我搜索了几天的示例,但在 Kotlin 代码中没有找到。它始终是一个带有带有片段的标签的活动,但绝不是带有 2 个标签且每个标签的片段的片段。谁能帮帮我?

搜索示例 en this 数周。我只想通过点击来更改标签,而不是滑动。

Mainactivity.kt

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

    // variable nodig vor de taalinstelling
    lateinit var mTaalVar : String // hier maken we de variabele GLOBAL
    //lateinit var mGuidVar : String // hier maken we de variabele GLOBAL
    lateinit var uniqueId: String // hier maken we de variabele GLOBAL

    // deze variabel hebben we nodig voor onze GUID die we geven in globalvarID
    val positiveButtonClick = { dialog: DialogInterface, _: Int ->
       // Toast.makeText(applicationContext, android.R.string.yes, Toast.LENGTH_LONG).show()
    }
    // variabelen om et kijken of de app voor de eerste keer open gaat
    var PRIVATE_MODE = 0
    val PREF_NAME = "myPreferences"
    val PREF_NAME1 = "myPreferences1"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //Deze moet hier staan anders klopt de vertaling niet
        setContentView(R.layout.activity_main)


        // dit moet er staan anders wordt de title en optionbuttons niet getoond
        setSupportActionBar(idToolbar)

        // variabele  declareren om te kijken of het de eerste keer is dat de app draait
        val sharePref: SharedPreferences = getSharedPreferences(PREF_NAME, PRIVATE_MODE)
       // val sharePref1: SharedPreferences = getSharedPreferences(PREF_NAME1, PRIVATE_MODE)

        //Hier halen we de waarde uit de sharedprefferences PREF_NAME
        val firstTime = sharePref.getBoolean(PREF_NAME, false)

        if (firstTime == false) {

            //val text5 = " Boolean False nog geen GUID"                        //debugger
           // val duration5 = Toast.LENGTH_LONG                                 //debugger
            //val toast5 = Toast.makeText(applicationContext, text5, duration5) //debugger
            //toast5.show()                                                     //debugger

            // hier zetten we de boolean op true en slaan we op in sharedPreferences (PREF_Name)
            val editor = sharePref.edit()
            editor.putBoolean(PREF_NAME, true)
            editor.apply()

            // hier slaan we de GUID op in sharedPreferences
             uniqueId = UUID.randomUUID().toString() // hier geven we een guid mee
             val editor1 = getSharedPreferences("Settings", Context.MODE_PRIVATE).edit() //"Settings" is de file waar we de key"My_Guid" met waarde uniqueId in opslaan
             editor1.putString("My_Guid", uniqueId)
             editor1.apply()

            //hier halen de taal op uit het toestel
            val CurrentLang = Locale.getDefault().language

            // showStartDialog()  //debugger

            // hier zetten we om naar hoofdletters om de webpagina's correct te kunnen laden
            if(CurrentLang == "fr") {
                setLocate("FR")
                recreate()
            } else if (CurrentLang == "nl"){
                setLocate("NL")
                recreate()
            } else if (CurrentLang == "de"){
                setLocate("DE")
                recreate()
            } else {
                setLocate("EN")
                recreate()
            }
            //hier laden we de indexpage in de contentpagina en moeten we de taal EN meegeven annders gaat he fout bij de eerste kker dat je de app installeert

            webviewContent.loadUrl("https://www.rectusoft.com/app_depaddel/index.php?taal=EN" )

            // Enable javascript in web view
            //webviewContent.settings.javaScriptEnabled=true

            // Enable zooming in web view
            webviewContent.settings.setSupportZoom(true)
            webviewContent.settings.builtInZoomControls = true
            webviewContent.settings.displayZoomControls = true
        }
        else {

            //taal
            loadLocate()

            // Ophalen van de GUID uit de file settings1
            val sharePref1: SharedPreferences = getSharedPreferences("Settings", PRIVATE_MODE)
            val guid = sharePref1.getString("My_Guid", "LEEG")

            //val text5 = " Boolean True    GUID = " +  guid + "  Taalinstelling:  " + mTaalVar
           // val duration5 = Toast.LENGTH_LONG
            //val toast5 = Toast.makeText(applicationContext, text5, duration5)
           // toast5.show()
            //hier laden we de indexpage in de contentpagina
            webviewContent.loadUrl("https://www.rectusoft.com/app_depaddel/index.php?taal=" + mTaalVar)
            // Enable zooming in web view
            webviewContent.settings.setSupportZoom(true)
            webviewContent.settings.builtInZoomControls = true
            webviewContent.settings.displayZoomControls = true
        }


        val toggle = ActionBarDrawerToggle(
            this, drawer_layout, idToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close
        )

        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()
        nav_view.setNavigationItemSelectedListener(this)

}


    override fun onBackPressed() {
        // code voor "bij het klikken van de backbutton komt het dialogscherm met de vraag om af te sluiten"
        val alertDialog1 = AlertDialog.Builder(this)
            //set icon
            .setIcon(android.R.drawable.ic_dialog_alert)
            //set title
            .setTitle(R.string.exit)
            //set message
            .setMessage(R.string.close)
            //set positive button
            .setPositiveButton(R.string.yes, DialogInterface.OnClickListener { dialog, _ ->
                //set what would happen when positive button is clicked
                finish()
            })
            //set negative button
            .setNegativeButton(R.string.no, DialogInterface.OnClickListener { _, _ ->
                //set what should happen when negative button is clicked
                Toast.makeText(applicationContext, R.string.nothing, Toast.LENGTH_LONG).show()
            })
            .show()
    }


    override fun onNavigationItemSelected(item: MenuItem): Boolean {
        // Handle navigation view item clicks here.
        when (item.itemId) {
            R.id.nav_time_table -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_timetable , Toast.LENGTH_SHORT).show()
                // Handle the  load timetable action
                loadTimetable(fragTimetable = timetable_fragment())
            }
            R.id.nav_my_time_table -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_my_timetable , Toast.LENGTH_SHORT).show()
                // Handle the  load my timetable action
                loadMyTimetable(fragMyTimetable = my_timetable_fragment())
            }
            R.id.nav_my_teams_details -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_my_teams_details , Toast.LENGTH_SHORT).show()
                // Handle the  load my timetable action
                loadMyTeamsDetails(fragMyTeamsDetails = my_teams_details_fragment())

            }
            R.id.nav_top_scoring_player -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_top_scoring_player , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadTopscore(fragTopScore = top_score_fragment())
            }
            R.id.nav_rectusoft_league -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_rectusoft_league , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadLeague(fragLeague = league_fragment())
            }

            R.id.nav_division1 -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_division1 , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadDivision1(fragDivision1 = division1_fragment())
            }

            R.id.nav_division2 -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_division2 , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadDivision2(fragDivision2 = division2_fragment())
            }

            R.id.nav_division3 -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_division3 , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadDivision3(fragDivision3 = division3_fragment())
            }

            R.id.nav_ladies_division -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this, R.string.nav_divisionLadies , Toast.LENGTH_SHORT).show()
                // Handle the  load TOP SCORE LIST action
                loadDivisionLadies(fragDivisionLadies = divisionLadies_fragment())
            }
        }

        drawer_layout.closeDrawer(GravityCompat.START)
        return true
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.main, menu)
        //taal
        loadLocate()
        //Deze moet er staan anders krijg je geen optie menu op je scherm
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            //hieronder worden de acties gemaakt als op een optionmenu geklikt wordt
            R.id.opt_about -> {
                // Er wordt steeds een toast weergegeven als er op een menu-item geklikt wordt.
                Toast.makeText(this,  R.string.opt_about, Toast.LENGTH_SHORT).show()

                showStartDialog()

                return super.onOptionsItemSelected(item)
            }
            R.id.opt_language -> {
                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this,  R.string.opt_my_language , Toast.LENGTH_SHORT).show()

                //hier laden we de functie om het keuzemenu te tonen
                showChangeLang()

                return super.onOptionsItemSelected(item)
            }

            R.id.opt_my_teams -> {

                // Er wordt steeds een toast weergegeven als er op een menuitem geklikt wordt.
                Toast.makeText(this,  R.string.opt_my_teams, Toast.LENGTH_SHORT).show()
                //hier laden we het scherm 'language'
                loadMyTeams(fragMyTeams = my_teams_fragment())
                //getSupportActionBar()?.setTitle("My Teams")
                return super.onOptionsItemSelected(item)
            }
            else -> return super.onOptionsItemSelected(item)
        }

    }

    /*private fun loadAbout(fragAbout: about_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragAbout)
        fm.commit()
    }*/

    private fun loadMyTeams(fragMyTeams: my_teams_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragMyTeams)
        fm.commit()
    }

    private fun loadMyTeamsDetails(fragMyTeamsDetails: my_teams_details_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragMyTeamsDetails)
        fm.commit()
    }

    //Als frameLayout in het rood blijft staan is omdat je het vergeten bent aan te maken op de \layout\content_Main
    private fun loadTimetable(fragTimetable: timetable_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragTimetable)
        fm.commit()
    }

    private fun loadMyTimetable(fragMyTimetable: my_timetable_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragMyTimetable)
        fm.commit()
    }

    private fun loadTopscore(fragTopScore: top_score_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragTopScore)
        fm.commit()
    }

    private fun loadLeague(fragLeague: league_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragLeague)
        fm.commit()
    }

    private fun loadDivision1(fragDivision1: division1_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragDivision1)
        fm.commit()
    }

    private fun loadDivision2(fragDivision2: division2_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragDivision2)
        fm.commit()
    }

    private fun loadDivision3(fragDivision3: division3_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragDivision3)
        fm.commit()
    }

    private fun loadDivisionLadies(fragDivisionLadies: divisionLadies_fragment) {
        val fm = supportFragmentManager.beginTransaction()
        fm.replace(R.id.igFrameLayout, fragDivisionLadies)
        fm.commit()
    }


    private fun showStartDialog(){                                                                        //debugger
       val builder = AlertDialog.Builder(this)                                                            //debugger

        builder.setTitle("RECTUSOFT")                                                                          //debugger
        builder.setMessage(R.string.about_text)                                 //debugger
        builder.setPositiveButton("ok",DialogInterface.OnClickListener(function = positiveButtonClick))   //debugger
        builder.show()

       }

    //taalinstelingen
    private fun setLocate (Lang: String){

        val locale = Locale(Lang)
        Locale.setDefault(locale)
        val config = Configuration()
        config.locale = locale
        baseContext.resources.updateConfiguration(config, baseContext.resources.displayMetrics)

        val editor = getSharedPreferences("Settings", Context.MODE_PRIVATE).edit()
        editor.putString("My_Lang", Lang)
        editor.apply()
    }

    private fun loadLocate(){
        val sharedPreferences = getSharedPreferences("Settings", Activity.MODE_PRIVATE)
        val language = sharedPreferences.getString("My_Lang", "EN")

        mTaalVar = language
        // val mApp = MyGlobalVar()
        //val mTaalVar = mApp.globalVarTaal
        setLocate(mTaalVar)
    }

    private fun showChangeLang(){

        val listItmes = arrayOf("Français","Nederlands","Deutsch","English")
        val mBuilder = AlertDialog.Builder( this@MainActivity)
        val title = mBuilder.setTitle(R.string.choos_your_language)

        mBuilder.setSingleChoiceItems(listItmes, -1) { dialog, which ->
            if(which == 0) {
                setLocate("FR")
                recreate()
                //finish()
            } else if (which == 1){
                setLocate("NL")
                recreate()
                // finish()
            } else if (which == 2){
                setLocate("DE")
                recreate()
                //finish()
            } else if (which == 3){
                setLocate("EN")
                recreate()
                // finish()
            }

            dialog.dismiss()
            System.runFinalizersOnExit(true)
        }
        val mDialog = mBuilder.create()
        mDialog.show()
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.DrawerLayout
        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"
        tools:context="com.rectusoft.tournamentorganizerkdp.MainActivity"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">

    <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer"/>

</android.support.v4.widget.DrawerLayout>

division1_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:title="@string/division_2" 
        android:id="@+id/tabLayout">

   <android.support.design.widget.TabLayout
           android:layout_width="378dp"
           android:layout_height="219dp"
           android:layout_marginTop="8dp" 
           app:layout_constraintTop_toTopOf="parent"
           android:layout_marginBottom="8dp" 
           app:layout_constraintBottom_toBottomOf="parent"
           app:layout_constraintStart_toStartOf="parent" 
           android:layout_marginLeft="8dp"
           android:layout_marginStart="8dp" 
           app:layout_constraintEnd_toEndOf="parent" 
           android:layout_marginEnd="8dp"
           android:layout_marginRight="8dp">

      <android.support.design.widget.TabItem
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Saturday"/>

      <android.support.design.widget.TabItem
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Sunday"/>

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

division1_fragment.kt

   class division1_fragment : Fragment() {


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInatanceState: Bundle?): View? {

        val viewPager: ViewPager? = view?.findViewById<ViewPager>(R.id.viewPager)
        if (viewPager != null) {
            val adapter = ViewPagerAdapter(childFragmentManager)
            viewPager.adapter = adapter
        }
        return view
    }

}

division1_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

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

      <android.support.v4.view.PagerTabStrip
              android:id="@+id/pager_header"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_gravity="top"
              android:background="@color/colorPrimary"
              android:padding="13dp"/>

   </android.support.v4.view.ViewPager>

ViewPageAdapter.kt

class ViewPagerAdapter internal constructor(fm: FragmentManager) : FragmentPagerAdapter(fm) {

    private val COUNT = 3

    override fun getItem(position: Int): Fragment? {
        var fragment: Fragment? = null
        when (position) {
            0 -> fragment = FirstFragment()
            1 -> fragment = SecondFragment()
            2 -> fragment = ThirdFragment()
        }

        return fragment
    }

    override fun getCount(): Int {
        return COUNT
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return "Tab " + (position + 1)
    }
}




  [1]: https://i.stack.imgur.com/PXor9.jpg

【问题讨论】:

  • 您好 KingMong007,欢迎来到 SO!你有你需要实现的图片吗?片段有一个 UI,没有什么能阻止片段包含一个模拟“选项卡”的伪按钮栏,您可以在其中点击它们来更改片段的内容。
  • 您好,非常感谢您回答我的问题。我仍在寻找解决方案,但没有找到任何东西?我会发一张照片。
  • 所以如果我点击抽屉菜单中的“Division 1”,它会打开一个片段(division1_fragment)。到目前为止,一切都很好。但现在我希望这个片段(division1_fragment)有 2 个标签,每个标签都有另一个内容(片段)。
  • 我不需要查看器在标签之间滑动。只需单击选项卡即可更改内容。
  • 让我看看我是否理解正确。您有一个包含抽屉的活动。您的 抽屉 具有用于各种目的地(您的部门)D1、D2、D3 等的菜单项。您希望 D1 有一个“选项卡”,以便您可以在 D1 和 D1 之间切换 D2(例如?)

标签: android kotlin tabs fragment


【解决方案1】:

你想要完成的事情

根据您对问题的描述,您真正想要完成的只是在 Fragment(而不是 Activity)中有一个 TabHost,因为您的 Navigation Drawer 会将您带到一个 Fragment,可能会替换当前显示了一个。

有什么问题?

您可能已经看到大多数 TabHost 示例被实现为一个 Activity,该 Activity 然后托管在点击时显示片段的选项卡。事实上,你所描述的并没有什么特别之处。

我会怎么做?

我个人会使用 ViewPager 而不是 TabHost(你说你不想要滑动手势,there are ways to do that),但无论你的解决方案如何,片段都可以显示子片段(也称为嵌套片段)。最重要的是要记住使用正确的 FragmentManager(有一个 getChildFragmentManager() 方法而不是通常的方法)。

方法(如documentation所述):

返回一个私有的 FragmentManager 用于在该 Fragment 中放置和管理 Fragment。

希望这能推动您朝着正确的方向前进,现在由您来测试、实施和调试您的解决方案;这些是您可以使用的一些工具。

当您实现此功能时,如果您发现某些东西没有按预期工作,请不要犹豫,发布有关您的实现的具体问题。

祝你好运!

【讨论】:

  • 嗨,谢谢,我想我有点远。但是我的 division1_fragment 中仍然有一个错误“未解决的参考:FindViewById”。我不知道出了什么问题?我已经在 Division1_fragment 中调整了上面的代码。
  • 嗨,我解决了错误“未解决的参考:......” bij 像这样更改我的代码。 val viewPager: ViewPager? = view?.findViewById(R.id.viewPager)。我不再收到错误消息,我的应用程序也没有崩溃,但是当我点击 Division 1 时什么也没发生。
  • 但是当我点击 Division 1 的抽屉菜单时,什么也没发生。谁能告诉我我做错了什么?
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多