【问题标题】:Bottom bar fragment reload底栏片段重新加载
【发布时间】:2017-06-29 09:51:06
【问题描述】:

这些是我的主要活动和片段。我不想每次返回底部栏视图的选项卡时都重新加载片段。现在,每次我单击该选项卡时,图像都会重新加载。 有什么解决办法吗?

主要活动

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;
}
}

【问题讨论】:

  • 是的,你可以,为片段设置一个标签,当你调用下一个片段时,一旦你回到上一个片段就隐藏当前片段,然后逐个标签找到片段并显示上一个片段
  • replace 将导致片段的生命周期重新启动。您可以使用addshowhide 的组合。例如,请参阅我的答案:stackoverflow.com/a/45595029/1102687

标签: android android-fragments android-viewpager reload bottombar


【解决方案1】:

像这样修改你的代码:

    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;

    }

如果片段已经存在,片段标签会避免再次重新创建片段。

【讨论】:

  • 我对那个代码也有同样的问题...我必须在片段中添加一些东西?
  • 你不需要向你的片段添加任何东西。只要确保每次替换片段时,都添加 transaction.replace(R.id.frame_layout, selectedFragment, selectedFragment.getTag());如果您不想重新创建片段,则 selectedFragment.getTag() 很重要
  • 好的,但是如果我复制你的代码,它会像以前一样重新加载片段......也许我必须添加一些东西以防中断部分?谢谢
  • 如果你想保存和恢复片段状态,你应该试试这个answer
  • getsupportfragmentmanger 在 oncreate 中不起作用...您认为还有其他解决方案吗?
猜你喜欢
  • 2012-12-15
  • 2012-11-25
  • 2022-10-12
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多