gpt4 book ai didi

java - 使用 BottomNavigationView 在它们之间切换时保留 fragment 状态

转载 作者:行者123 更新时间:2023-11-29 18:44:59 25 4
gpt4 key购买 nike

我有一个 Bottom Navigation View 并且我想以这样的方式使用 fragmentNavigation 每次用户单击 navigation View 的部分,fragment 应该加载以前的状态而不是创建新的 fragment。我有一个 Frame Layout 并且所有 fragment 都应该在那个 Frame Layout 中加载或替换。这是我的代码 opublic class MainActivity extends AppCompatActivity {

    BottomNavigationView navigation;
Home home;
Trending trending;
Upload upload;
ImageView uploadImage;
final public static int UPLOAD_ACTIVITY_CODE = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigation = findViewById(R.id.navigation);
uploadImage = findViewById(R.id.uploadimg);
home = new Home();
trending = new Trending();
upload = new Upload();
fragmentLoad(home);
uploadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), UploadActivity.class);
startActivityForResult(intent,UPLOAD_ACTIVITY_CODE);
}
});
navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.home:
fragmentLoad(home);
break;
case R.id.trending:
fragmentLoad(trending);
break;
case R.id.upload:
fragmentLoad(upload);
break;
}
return true;
}
});
}

public void fragmentLoad(android.support.v4.app.Fragment fragment){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame, fragment);
transaction.commit();
}

public void fragmentLoad(android.support.v4.app.Fragment fragment,Bundle bundle){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction().show(fragment);
fragment.setArguments(bundle);
transaction.replace(R.id.frame, fragment);
transaction.commit();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==UPLOAD_ACTIVITY_CODE && resultCode==UPLOAD_ACTIVITY_CODE && data!=null){
String desc = data.getStringExtra("Desc");
String title= data.getStringExtra("Title");
String photo= data.getStringExtra("PhotoUri");
String duration= data.getStringExtra("duration");
String video= data.getStringExtra("videoUri");
Bundle bundle = new Bundle();
bundle.putString("desc",desc);
bundle.putString("title",title);
bundle.putString("photo",photo);
bundle.putString("duration",duration);
bundle.putString("videoUri",video);
fragmentLoad(upload,bundle);
navigation.setSelectedItemId(R.id.upload);
}
}
}

最佳答案

您应该从每个 fragment 创建一个实例,然后使用 FragmentManager 根据底部导航状态显示它们。您应该在 Upload fragment 类中编写一个名为 setData 的方法来重新初始化其 View 。我为此案例编写了一个类,希望对您有所帮助。

public class MainActivity extends AppCompatActivity  {

public static final int UPLOAD_ACTIVITY_CODE = 100;
private BottomNavigationView navigation;
private ImageView uploadImage;
private Home home;
private Trending trending;
private Upload upload;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigation = findViewById(R.id.navigation);
uploadImage = findViewById(R.id.uploadimg);
home = new Home();
trending = new Trending();
upload = new Upload();

navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
navigation.getMenu().findItem(R.id.home).setChecked(true);

getSupportFragmentManager().beginTransaction()
.add(R.id.frame, home)
.add(R.id.frame, category)
.add(R.id.frame, search)
.commit();
setTabStateFragment(TabState.HOME);

uploadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), UploadActivity.class);
startActivityForResult(intent, UPLOAD_ACTIVITY_CODE);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == UPLOAD_ACTIVITY_CODE && resultCode == UPLOAD_ACTIVITY_CODE && data != null) {
String desc = data.getStringExtra("Desc");
String title = data.getStringExtra("Title");
String photo = data.getStringExtra("PhotoUri");
String duration = data.getStringExtra("duration");
String video = data.getStringExtra("videoUri");
Bundle bundle = new Bundle();
bundle.putString("desc", desc);
bundle.putString("title", title);
bundle.putString("photo", photo);
bundle.putString("duration", duration);
bundle.putString("videoUri", video);
upload.setData(bundle);
setTabStateFragment(TabState.UPLOAD);
}
}

private void setTabStateFragment(TabState state) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
switch (state) {
case HOME: {
transaction.show(home);
transaction.hide(trending);
transaction.hide(upload);
}
case TRENDING: {
transaction.hide(home);
transaction.show(trending);
transaction.hide(upload);
}
case UPLOAD: {
transaction.hide(home);
transaction.hide(trending);
transaction.show(upload);
}
}
transaction.commit();
}

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.home: {
setTabStateFragment(TabState.HOME);
return true;
}
case R.id.trending: {
setTabStateFragment(TabState.TRENDING);
return true;
}
case R.id.upload: {
setTabStateFragment(TabState.UPLOAD);
return true;
}
}
return false;
}
};

enum TabState {
HOME,
TRENDING,
UPLOAD,
}

}

关于java - 使用 BottomNavigationView 在它们之间切换时保留 fragment 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com