Android 底杆碎片重新加载
这些是我的主要活动和片段。我不想每次在底部栏视图的选项卡上返回时都重新加载片段。事实上,现在每次我点击该选项卡,图像都会重新加载。 有什么解决办法吗 主要活动Android 底杆碎片重新加载,android,android-fragments,android-viewpager,reload,bottombar,Android,Android Fragments,Android Viewpager,Reload,Bottombar,这些是我的主要活动和片段。我不想每次在底部栏视图的选项卡上返回时都重新加载片段。事实上,现在每次我点击该选项卡,图像都会重新加载。 有什么解决办法吗 主要活动 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavigationView = (BottomNavigationView)
findViewById(R.id.navigation);
bottomNavigationView.setOnNavigationItemSelectedListener
(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment selectedFragment = null;
switch (item.getItemId()) {
case R.id.action_item1:
selectedFragment = Tab1.newInstance();
break;
case R.id.action_item2:
selectedFragment = Tab2.newInstance();
break;
case R.id.action_item3:
selectedFragment = Tab3.newInstance();
break;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, selectedFragment);
transaction.commit();
return true;
}
});
//Manually displaying the first fragment - one time only
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, Tab1.newInstance());
transaction.commit();
//Used to select an item programmatically
//bottomNavigationView.getMenu().getItem(2).setChecked(true);
}
}
碎片
public class Tab1 extends Fragment {
ImageView imageview;
ProgressDialog progressDialog;
public static Tab1 newInstance() {
Tab1 fragment = new Tab1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_tab1, container, false);
imageview =(ImageView) rootView.findViewById(R.id.immagine);
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("gs://test-x3b2c.appspot.com").child("lc.jpg");
//download file as a byte array
progressDialog = ProgressDialog.show(getActivity(), "Attendi",
"Sto caricando il luogo comune", true);
try {
final File localFile = File.createTempFile("images", "jpg");
storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Bitmap bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
imageview.setImageBitmap(bitmap);
progressDialog.dismiss();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
}
catch (IOException e) {
}
return rootView;
}
}
public类Tab1扩展了片段{
图像视图图像视图;
进行对话进行对话;
公共静态选项卡1 newInstance(){
Tab1片段=新Tab1();
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.activity_tab1,容器,false);
imageview=(imageview)rootView.findViewById(R.id.immagine);
FirebaseStorage=FirebaseStorage.getInstance();
StorageReference storageRef=storage.getReferenceFromUrl(“gs://test-x3b2c.appspot.com”).child(“lc.jpg”);
//以字节数组形式下载文件
progressDialog=progressDialog.show(getActivity(),“Attendi”,
“Sto caricando il luogo comune”,真实);
试一试{
最终文件localFile=File.createTempFile(“图像”、“jpg”);
storageRef.getFile(localFile).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FileDownloadTask.TaskSnapshot TaskSnapshot){
位图位图=BitmapFactory.decodeFile(localFile.getAbsolutePath());
设置图像位图(位图);
progressDialog.disclose();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
}
});
}
捕获(IOE异常){
}
返回rootView;
}
}
如下修改代码:
switch (item.getItemId()) {
case R.id.action_item1:
selectedFragment = Tab1.newInstance();
break;
case R.id.action_item2:
selectedFragment = Tab2.newInstance();
break;
case R.id.action_item3:
selectedFragment = Tab3.newInstance();
break;
}
if(selectedFragment ! =null) {
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_layout, selectedFragment, selectedFragment.getTag());
transaction.commit();
}
return true;
}
如果片段已经存在,片段标记可以避免重新创建该片段。可以,为片段设置一个标记,在调用下一个片段时,在返回到上一个片段后隐藏当前片段,然后逐个标记查找片段,并向您显示上一个片段
replace
将导致片段的生命周期重新启动。您可以结合使用添加
、显示
和隐藏
。请看我的答案这里的一个例子:我有相同的问题,该代码。。。我必须在片段中添加一些东西?你不需要在片段中添加任何东西。只要确保每次替换片段时都添加了transaction.replace(R.id.frame\u布局,selectedFragment,selectedFragment.getTag());如果您不想重新创建片段,selectedFragment.getTag()很重要。好的,但是如果我复制您的代码,它会像以前一样重新加载片段……也许我必须添加一些东西以防中断部分?谢谢你应该试试这个,如果你想保存和恢复片段状态GetSupportFragmentManger在oncreate中不起作用…你认为还有其他解决方案吗?