首页 > 解决方案 > 片段滑动无需重新创建和重叠

问题描述

我看到很多类似的问题,甚至从一个(隐藏/显示)中得到了答案,但我发现当你旋转设计或打开夜间模式时,嵌入谷歌体验中,此时打开的片段替换了背景其他片段。我该如何解决?view如果我们用另一个片段替换它似乎会出现<fragment>,但我不确定。同样在API中,我读到有一种setRetainInstance方法可以在旋转片段时保存片段,但将其添加到onCreateView并没有改变任何内容。

///activity_main

<!-- Fragments Container -->

<include
    android:id="@+id/fragment"
    layout="@layout/activity_main2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/navigation"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<!-- Bottom Navigation View -->

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_navigation" />

///主要活动

import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

    final Fragment fragment1 = new MapsFragment();
    final Fragment fragment2 = new StatsFragment();
    final Fragment fragment3 = new NewsFragment();
    final Fragment fragment4 = new MoreFragment();
    final FragmentManager fm = getSupportFragmentManager();
    private int tabId;
    Fragment active = fragment1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadData();
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        navigation.setSelectedItemId(tabId);

        switch (tabId){
            case R.id.navigation_map:
                fm.beginTransaction().add(R.id.fragment, fragment4, "4").hide(fragment4).commit();
                fm.beginTransaction().add(R.id.fragment, fragment3, "3").hide(fragment3).commit();
                fm.beginTransaction().add(R.id.fragment, fragment2, "2").hide(fragment2).commit();

                fm.beginTransaction().add(R.id.fragment,fragment1, "1").commit();
                return;
            case R.id.navigation_stats:
                fm.beginTransaction().add(R.id.fragment, fragment4, "4").hide(fragment4).commit();
                fm.beginTransaction().add(R.id.fragment, fragment2, "2").hide(fragment2).commit();
                fm.beginTransaction().add(R.id.fragment, fragment1, "1").hide(fragment1).commit();

                fm.beginTransaction().add(R.id.fragment,fragment3, "3").commit();
                return;
            case R.id.navigation_news:
                fm.beginTransaction().add(R.id.fragment, fragment4, "4").hide(fragment4).commit();
                fm.beginTransaction().add(R.id.fragment, fragment3, "3").hide(fragment3).commit();
                fm.beginTransaction().add(R.id.fragment, fragment1, "1").hide(fragment1).commit();

                fm.beginTransaction().add(R.id.fragment,fragment2, "2").commit();
                return;
            case R.id.navigation_more:
                fm.beginTransaction().add(R.id.fragment, fragment3, "3").hide(fragment3).commit();
                fm.beginTransaction().add(R.id.fragment, fragment2, "2").hide(fragment2).commit();
                fm.beginTransaction().add(R.id.fragment, fragment1, "1").hide(fragment1).commit();

                fm.beginTransaction().add(R.id.fragment,fragment4, "4").commit();
                return;
                default:
                    fm.beginTransaction().add(R.id.fragment, fragment4, "4").hide(fragment4).commit();
                    fm.beginTransaction().add(R.id.fragment, fragment3, "3").hide(fragment3).commit();
                    fm.beginTransaction().add(R.id.fragment, fragment2, "2").hide(fragment2).commit();
                    fm.beginTransaction().add(R.id.fragment,fragment1, "1").commit();
        }
    }
    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            tabId = item.getItemId();
            //Fragment selectedFragment = null;
            switch (tabId) {
                case R.id.navigation_map:
                    fm.beginTransaction().hide(active).show(fragment1).commit();
                    active = fragment1;
                    return true;
                case R.id.navigation_stats:
                    fm.beginTransaction().hide(active).show(fragment2).commit();
                    active = fragment2;
                    return true;
                case R.id.navigation_news:
                    fm.beginTransaction().hide(active).show(fragment3).commit();
                    active = fragment3;
                    return true;
                case R.id.navigation_more:
                    fm.beginTransaction().hide(active).show(fragment4).commit();
                    active = fragment4;
                    return true;
            }
            return false;
        }
    };

    @SuppressLint("ApplySharedPref")
    private void saveData(){
        SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("tabId", tabId).commit();
    }

    private void loadData(){
        SharedPreferences preferences = getSharedPreferences("preferences",MODE_PRIVATE);
        tabId = preferences.getInt("tabId",0);
    }

    @Override
    protected void onStop() {
        saveData();
        super.onStop();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("tabId",tabId);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
}

重叠

标签: javaandroidandroid-fragments

解决方案


尝试这个:

findViewById<BottomNavigationView>(R.id.bottom_navigation)
                .setOnNavigationItemSelectedListener(object : BottomNavigationView.OnNavigationItemSelectedListener {
                    override fun onNavigationItemSelected(item: MenuItem): Boolean {
                        var fragment : Fragment = CategoriesFragmentKT.newInstance()
                        when (item.itemId) {
                            R.id.action_categories -> fragment= CategoriesFragmentKT.newInstance()
                            R.id.action_search -> fragment = SearchFragment.newInstance()
                            R.id.action_favorites -> fragment = FavoritesFragment.newInstance()
                        }
                        fragmentExecutor(fragment, R.id.container, false)
                        return true
                    }
                })

        fragmentExecutor(CategoriesFragmentKT.newInstance(), R.id.container, false)

而不是添加片段,而是替换它们:

 fun fragmentExecutor(fragment: Fragment?, containerId: Int, push: Boolean) {
        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()

        fragmentTransaction.replace(containerId, fragment)

        if (push && fragment != null) {
            fragmentTransaction.addToBackStack(fragment.tag)
        }
        fragmentTransaction.commitAllowingStateLoss()
    }

推荐阅读