java - 片段滑动无需重新创建和重叠
问题描述
我看到很多类似的问题,甚至从一个(隐藏/显示)中得到了答案,但我发现当你旋转设计或打开夜间模式时,嵌入谷歌体验中,此时打开的片段替换了背景其他片段。我该如何解决?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);
}
}
解决方案
尝试这个:
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()
}
推荐阅读
- android - 图像保存到内部存储后在图库中显示图像
- java - Arraylist 上的 java.util.NoSuchElementException 而
- excel - 在 PowerPoint 中调用名称在 Excel 单元格中的宏
- reactjs - 如何在 React App 中访问 ResponseEntity?
- kotlin - Kotlin List 中 plus() 与 add() 的区别
- jenkins - Jenkins Job DSL 在 postBuildScripts shell 中获取当前构建结果
- laravel - 如何使用 vue axios 在 laravel 中解决 401 未授权响应
- javascript - OT.Publisher.onStreamAvailableError NotAllowedError:获取用户媒体时出现未知错误
- nginx - 有关 simd 图像处理解决方案的总体简要信息
- ajax - 无法使用 Ajax for Razor Pages 加载数据