Остановить фрагменты, вызывающие onCreateOptionsMenu - PullRequest
0 голосов
/ 20 марта 2019

У меня есть приложение, в котором пользователи могут переключаться между фрагментом списка и фрагментом карты, используя переключатель в рамках одного действия. У меня возникают проблемы, когда пользователь переключает представление фрагмента на onCreateOptionsMenu.

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

IE. фильтрация по «английским землетрясениям» в представлении списка показывает желаемый результат, но переключение в представление карты сбрасывается, потому что фрагмент карты снова вызывает метод CreateCptionsMenu.

showing the ability to switch fragment dynamically

метод onCreateOptionsMenu в MainActivity

    //Inflating Menue
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.toolbar_menu,menu);


    MenuItem item = menu.findItem(R.id.spinner);
    spinner = (Spinner) item.getActionView();

    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, R.layout.action_share,  getResources().getStringArray(R.array.Planets)){
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //Explicitly used to turn spinner into an icon
            LayoutInflater inflater=getLayoutInflater();
            View view=inflater.inflate(R.layout.action_share, parent, false);

            return view;
        }
    };

    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(dataAdapter);
    spinner.setBackground(getResources().getDrawable(android.R.drawable.ic_menu_search));

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        {
            String selectedItem = parent.getItemAtPosition(position).toString();
            ChangeView(selectedItem);
        } // to close the onItemSelected
        public void onNothingSelected(AdapterView<?> parent)
        {

        }
    });

    return true;

Код переключения фрагментов в onCreate в MainActivity

        onOffSwitch = (Switch)  findViewById(R.id.switchy);
    onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked == true){
                //Changes to the map Fragment
                ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.framlayoutMap, new NonListfragment());
                ft.addToBackStack(null);
                ft.commit();
            }
            else
            {
                //Changes to the list fragment
                ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.framlayoutMap, new EQListFragment ());
                ft.addToBackStack(null);
                ft.commit();
            }
        }
    });

    //Used to set it so the starting of the application does not have blank fragment
    ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.framlayoutMap, new EQListFragment ());
    ft.commit();

Создать в фрагменте списка

public class EQListFragment extends ListFragment implements AdapterView.OnItemClickListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    setHasOptionsMenu(false);
}

onCreate во фрагменте карты не имеет sethasOptionsMenu, установленной в false, поскольку это расширяет FragmentActivity

Дело в том, как остановить фрагмент, вызывающий onCreateOptionsMenu в родительском действии при его загрузке. Похоже, это также происходит, когда устройство вращается.

...