Сохранять данные при переключении фрагментов - PullRequest
0 голосов
/ 08 ноября 2018

Работа над приложением, включающим 3 фрагмента. Я хочу сохранить данные в FragmentA, когда пользователь решит переключиться обратно на FragmentA из FragmentB или FragmentC через BottomNavigationView. Мой код прекрасно работает с изменением ориентации экрана, но по какой-то причине он не сохранит данные об изменении фрагмента.

Для тестирования я использовал только один EditText, который должен сохранять данные из строки.

MainActivity

public class MainActivity extends AppCompatActivity implements 
BottomNavigationView.OnNavigationItemSelectedListener {

Fragment Frag = new Fragment();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(this); // mOnNavigationItemSelectedListener


    if (savedInstanceState != null)
    {
        Frag = getSupportFragmentManager().getFragment(savedInstanceState, "Frag");
    }
    else
    loadFragment(new FragmentA());
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    Fragment fragment = null;
    int i = menuItem.getItemId();
    if (i == R.id.fragmentA) {
        fragment = new FragmentA();
    } else if (i == R.id.fragmentB) {
        fragment = new FragmentB();
    } else if (i == R.id.fragmentC) {
        fragment = new FragmentC();           
    }

    return loadFragment(fragment);
}

private boolean loadFragment(Fragment fragment)
{
    if (fragment != null)
    {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
        Frag = fragment;
        return true;
    }
    return false;
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getSupportFragmentManager().putFragment(outState, "Frag", Frag);
}
}

Fragmenta

public class FragmentA extends Fragment {

EditText editText;
String string;

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

    if (savedInstanceState != null)
    {
        string = savedInstanceState.getString("Text", "");
    }
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // return super.onCreateView(inflater, container, savedInstanceState);
    LayoutInflater layoutInflater = getActivity().getLayoutInflater();
    View view = layoutInflater.inflate(R.layout.fragmentA, container, false);

    editText = view.findViewById(R.id.centerText);
    editText.setText(string);
    return view;
}

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    string = editText.getText().toString();
    outState.putString("Text", string);
}
}

Я хочу, чтобы editText сохранял данные, когда пользователь переключается обратно на FragmentA из FragmentB или FragmentC. Я боролся с этой проблемой в течение некоторого времени, пробуя разные методы без удачи.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Либо вы можете хранить ссылки на свои фрагменты, вместо того, чтобы создавать новые каждый раз, как вы делаете здесь:

if (i == R.id.fragmentA) {
    fragment = new FragmentA();
} else if (i == R.id.fragmentB) {
    fragment = new FragmentB();
} else if (i == R.id.fragmentC) {
    fragment = new FragmentC();           
}

Вы также можете использовать ViewPager, который позволяет не только проводить пальцем между экранами, но и устанавливать viewPager.setOffscreenPageLimit(i);, что означает, что фрагменты не будут воссозданы, если они не находятся слишком далеко от экрана.

0 голосов
/ 08 ноября 2018

Спасибо за ваши ответы. Это то, что я изменил. Сейчас он работает, хотя я не уверен, что это элегантный способ решить эту проблему. Данные теперь сохраняются в EditText при переходе обратно к FragmentA.

MainActivity

public class MainActivity extends AppCompatActivity implements 
BottomNavigationView.OnNavigationItemSelectedListener {

Fragment Frag = new Fragment();
Fragment FragmentA;
Fragment FragmentB;
Fragment FragmentC;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(this); // mOnNavigationItemSelectedListener

    FragmentA = new FragmentA();
    FragmentB = new FragmentB();
    FragmentC = new FragmentC();

    if (savedInstanceState != null)
    {
        Frag = getSupportFragmentManager().getFragment(savedInstanceState, "Frag");
    }
    else
    loadFragment(FragmentA);
}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    Fragment fragment = null;
    int i = menuItem.getItemId();
    if (i == R.id.fragmentA) {
        fragment = FragmentA;
    } else if (i == R.id.fragmentB) {
        fragment = FragmentB;
    } else if (i == R.id.fragmentC) {
        fragment = FragmentC;
    }
    return loadFragment(fragment);
}

private boolean loadFragment(Fragment fragment)
{
    if (fragment != null)
    {
        getSupportFragmentManager().beginTransaction().hide(FragmentA).commit();
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
        getSupportFragmentManager().beginTransaction().show(fragment).commit();

        Frag = fragment;
        return true;
    }
    return false;
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getSupportFragmentManager().putFragment(outState, "Frag", Frag);
}
}
0 голосов
/ 08 ноября 2018

Вот ваша ошибка

if (i == R.id.fragmentA) {
    fragment = new FragmentA();
} else if (i == R.id.fragmentB) {
    fragment = new FragmentB();
} else if (i == R.id.fragmentC) {
    fragment = new FragmentC();           
}

При нажатии вы создаете новый экземпляр фрагмента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...