Фрагмент с 2-мя вкладками без видоискателя - PullRequest
0 голосов
/ 24 июня 2019

[Изображение меню моего ящика] [1] У меня есть приложение с ящиком навигации с фрагментами.Теперь я хочу, чтобы в одном фрагменте было 2 вкладки, а на каждой вкладке - другой фрагмент.Я искал несколько дней в качестве примера, но не нашел его в коде Котлина.Это всегда действие с вкладками с фрагментами, но не фрагмент с 2 вкладками и каждый фрагмент.Кто может мне помочь?

В течение нескольких недель я искал пример.Я хочу изменить вкладку, щелкнув ее, а не проведя пальцем.

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

1 Ответ

0 голосов
/ 25 июня 2019

Чего вы пытаетесь достичь

Из описания вашей проблемы реальная вещь, которую вы пытаетесь выполнить, - это просто иметь TabHost внутри фрагмента (в отличие от действия), потому что ваш Навигационный ящик переносит вас во фрагмент, вероятно, заменяя текущий отображается один.

В чем проблема?

Скорее всего, вы видели большинство примеров TabHost, реализованных в виде Activity, которая затем содержит вкладки, которые отображают фрагменты при нажатии. По правде говоря, в том, что вы описываете, нет ничего особенного.

Что бы я сделал?

Я бы лично использовал ViewPager вместо TabHost (вы сказали, что вам не нужен жест смахивания, и есть способы сделать это ), но независимо от вашего решения, фрагмент может отображать Child (также известный как Nested) фрагменты. Самое главное - не забывайте использовать правильный FragmentManager (вместо обычного метода getChildFragmentManager()).

Метод (как описано в документации ):

Возвращает приватный FragmentManager для размещения и управления фрагментами внутри этого фрагмента.

Надеюсь, это направит вас в правильном направлении, а теперь вам предстоит протестировать, внедрить и отладить ваше решение; Вот некоторые из инструментов в вашем распоряжении.

Когда вы реализуете это, не стесняйтесь задавать конкретные вопросы о вашей реализации, если вы обнаружите, что что-то работает не так, как ожидалось.

Удачи!

...