【问题标题】:Save state of fragments using BottomNavigationView使用 BottomNavigationView 保存片段的状态
【发布时间】:2018-02-16 02:15:18
【问题描述】:

我正在使用底部导航视图。我有三个带有表单的选项卡。当用户转到另一个选项卡然后回来时,我想保留用户在字段中写的内容。 这是包含 BottomNavigationView 的 Activity。

public class MainActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

@BindView(R.id.bottom_navigation)
BottomNavigationView navigation;
@BindView(R.id.toolbar)
Toolbar toolbar;

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

    initToolbar();
    navigation.setOnNavigationItemSelectedListener(this);
    //select first tab
    navigation.setSelectedItemId(R.id.navigation_expiration_key);
}

@Override
protected void initializeDagger() {
    ((MainApplication) getApplicationContext()).getAppComponent().inject(this);
}

@Override
protected void initializePresenter() {
}

@Override
public int getLayoutId() {
    return R.layout.activity_main;
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    Fragment selectedFragment = null;
    switch (item.getItemId()) {
        case R.id.navigation_expiration_key:
            selectedFragment = KeyExpirationFragment.newInstance();
            break;
        case R.id.navigation_place_identification:
            selectedFragment = LockIdentificationFragment.newInstance();
            break;
        case R.id.navigation_bt_key:
            selectedFragment = BtKeyValidationMenuFragment.newInstance();
            break;
    }
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.main_container, selectedFragment);
    transaction.commit();
    return true;
}

我尝试使用以下方法将状态保存在片段中:

    @Override
public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString(KEY_NUMBER, keyNumberField.getText().toString());
    savedInstanceState.putString(CUSTOMER, customerField.getText().toString());
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        String keyNumber = savedInstanceState.getString(KEY_NUMBER);
        keyNumberField.setText(keyNumber);
        String customer = savedInstanceState.getString(CUSTOMER);
        customerField.setText(customer);
    }
}

但在转到其他选项卡时永远不会调用 onSaveInstanceState。 我知道我们在浏览应用程序时不应该保存片段的状态。这被假装在 f.e. 时触发。手机旋转。

但是当我们使用 ViewPager 等保存状态时,应该有一种方法可以正确地保持这些状态。不使用共享首选项或错误修复。

问候。

【问题讨论】:

  • 您在使用视图寻呼机吗?
  • 完全没有。尽你所能。

标签: android bundle state bottomnavigationview


【解决方案1】:

我自己也在寻找这个答案。我不确定,因为我已经看到了这两种方式,但我确实认为你需要你的超级线路在其他线路之后。像这样:

public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {         
     savedInstanceState.putString(KEY_NUMBER, keyNumberField.getText().toString());
     savedInstanceState.putString(CUSTOMER, customerField.getText().toString());
     super.onSaveInstanceState(savedInstanceState);
}

编辑 2:我将通过 RayWenderlich 教程尝试片段。 https://www.raywenderlich.com/169885/android-fragments-tutorial-introduction-2

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多