[在Android的BottomNavigationView中使用其他菜单后,数据未加载到HomeFragment中

问题描述 投票:-1回答:1

我正在从网络中获取数据并显示在列表中。我在主屏幕中使用BottomNavigationView。它显示4个选项卡。当我启动该应用程序时,数据正在主屏幕中加载,但是当我转到底部导航视图中的某些其他选项卡并返回到主选项卡时,则数据未加载。在主屏幕中具有查看寻呼机选项卡。

MainActivity.kt

class MainActivity:AppCompatActivity(),BottomNavigationView.OnNavigationItemSelectedListener {

lateinit var tabs: TabLayout
lateinit var toolbar: Toolbar
lateinit var sharedPreferences: SharedPreferences

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    sharedPreferences = getSharedPreferences(AppConstants.PREF_NAME, Context.MODE_PRIVATE)

    toolbar = findViewById(R.id.toolbar)
    setSupportActionBar(toolbar)
    toolbar.setTitle(R.string.app_name)

    val navigationView1: BottomNavigationView = findViewById(R.id.nav_view)
    navigationView1.setOnNavigationItemSelectedListener(this)

    if (savedInstanceState == null) {
        loadFragment(MainFragment())
    }
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    var fragment: Fragment? = null

    when (item.itemId) {
        R.id.news -> {
            invalidateOptionsMenu()
            fragment = MainFragment()
        }

        R.id.source -> {
            fragment = SourcesFragment()
            toolbar.getMenu().clear()
            toolbar.setTitle("News Sources")
        }

        R.id.save -> {
            toolbar.setTitle("Saved Articles")
            toolbar.getMenu().clear()
            fragment = WatchListFragment()
        }

        R.id.settings -> {
            toolbar.setTitle("Settings")
            toolbar.getMenu().clear()
            fragment = SettingsFragment()
        }
    }

    loadFragment(fragment)
    return true
}

private fun loadFragment(fragment: Fragment?) {
    val transaction = supportFragmentManager.beginTransaction()
        .setCustomAnimations(R.anim.design_bottom_sheet_slide_in, R.anim.design_bottom_sheet_slide_out)
    transaction.replace(R.id.container, fragment!!)
    transaction.commit()
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    when (item?.itemId) {
        R.id.action_search -> {
            startActivity(Intent(this, SearchActivity::class.java))
        }
        else -> ""
    }
    return true
}

}

MainFragment.kt

class MainFragment:Fragment(){lateinit var标签:TabLayoutlateinit var pager:ViewPagerlateinit var适配器:PagerAdapter

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    var view = inflater.inflate(R.layout.fragment_main, container, false)

    pager = view.findViewById(R.id.viewpager)
    setupViewPager(pager)

    pager.addOnPageChangeListener(onPageChangeListener)

    tabs = view.findViewById(R.id.tabs)
    tabs.setupWithViewPager(pager)
    Log.d("LIVE", "onCreateView")
    return view
}

private fun setupViewPager(pager: ViewPager) {
    adapter = PagerAdapter(fragmentManager!!)
    adapter.addFragment(TopNewsFragment(), "Top News")
    adapter.addFragment(TechnologyFragment(), "Technology")
    adapter.addFragment(BusinessFragment(), "Business")
    adapter.addFragment(SportsFragment(), "Sports")
    adapter.addFragment(EntertainmentFragment(), "Entertainment")
    adapter.addFragment(ScienceFragment(), "Science")
    adapter.addFragment(HealthFragment(), "Health")
    pager.adapter = adapter
    adapter.notifyDataSetChanged()
}
private val onPageChangeListener = object : ViewPager.OnPageChangeListener {
    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
    }

    override fun onPageSelected(position: Int) {
        adapter.notifyDataSetChanged()
    }

    override fun onPageScrollStateChanged(state: Int) {
    }
}

}

fragment_main.xml

<FrameLayout 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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            style="@style/Widget.MaterialComponents.TabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:elevation="10dp"
            app:tabGravity="center"
            app:tabIndicatorColor="@color/tab_selected_color"
            app:tabMode="scrollable"
            app:tabSelectedTextColor="@color/tab_selected_color"
            app:tabTextColor="@color/textColorPrimary" />

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    </LinearLayout>

</FrameLayout>

activity_main.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="10dp">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:elevation="4dp"
        app:itemIconTint="@drawable/bottom_navigation_text_color"
        app:itemTextColor="@drawable/bottom_navigation_text_color"
        app:labelVisibilityMode="labeled"
        app:menu="@menu/bottom_navigation_menu" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Home Screen

DataNotloading

android kotlin retrofit bottomnavigationview
1个回答
0
投票

您需要添加

pager.setOffscreenPageLimit(2)

之后

pager = view.findViewById(R.id.viewpager)

有关详细信息https://developer.android.com/reference/android/support/v4/view/ViewPager#setoffscreenpagelimit

UPDATE

根据新发现,当您在片段之间滑动时,会保存您的片段状态。之所以保存,是因为您滑动时Viewpager会起作用。设置pager.setOffscreenPageLimit(2)时,将保存两侧的两个片段。因此,刷卡没有问题。

但是,当您使用BottomNavigationView选择片段时,将在更改片段时替换新片段。使用下面的BottomNavigationView代码,可以解决此问题。

Bottom Line您可以使用隐藏代替使用BottomNavigationView创建/替换新片段。

MainActivity

声明这样的片段变量

Fragment activeFragment= new MainFragment();

在onCreate中,在setContentView之后,隐藏所有片段并将其提交给片段管理器,但不要隐藏将用作主片段的第一个片段。

  fm.beginTransaction().add(R.id.main_container,fragment1).commit();
  fm.beginTransaction().add(R.id.main_container, fragment2).hide(fragment2).commit();
  fm.beginTransaction().add(R.id.main_container, fragment3).hide(fragment3).commit();

这样替换您的loadFragment()。

 private fun loadFragment(fragment: Fragment?) {
    val transaction = supportFragmentManager.beginTransaction()
        .setCustomAnimations(R.anim.design_bottom_sheet_slide_in, R.anim.design_bottom_sheet_slide_out).hide(active).show(fragment).commit();
    transaction.commit()
       activeFragment=fragment;
}
© www.soinside.com 2019 - 2024. All rights reserved.