Ошибка: обмен между фрагментами - PullRequest
0 голосов
/ 26 сентября 2018
  • Я постараюсь объяснить в лучшем случае, добавив ссылки и изображения, в которых, как мне кажется, трудно объяснить словами, с какой ошибкой я столкнулся.Работая с фрагментами и навигационным ящиком, я сталкивался с этой ошибкой:

image image

  • Время от времени, когда я открываю меню навигациипредыдущий фрагмент дублируется или загружается снова.Эта вещь совершенно случайна, без точной схемы.Единственное, что кажется связанным - это RecyclerView и Навигационный ящик.
  • Только потому, что я не знаю, где я ошибаюсь, пишите в комментариях, если вам что-то нужно, код или другую информацию, и время от времениЯ добавлю его к исходному вопросу.
  • Я не получаю никаких ошибок и помогаю вам и вам добавить код и изображения того, как этот фрагмент загружается без ошибок:

image image

@Override
public boolean onNavigationItemSelected(MenuItem item) {

    Fragment fragment = null;
    Class aclass = null;
    Bundle args = new Bundle();
    Intent intentOperatore = getIntent();
    String mParamOperatore = intentOperatore.getStringExtra(ARG_PARAM_OPERATORE);
    boolean navigation = Boolean.FALSE;
    boolean intent = Boolean.FALSE;
    boolean scan = Boolean.FALSE;
    boolean exit = Boolean.FALSE;

    try{
        switch (item.getItemId()){
            case R.id.nav_home:
                aclass = HomeFragment.class;
                fragment = (Fragment) aclass.newInstance();
                args.putString(ARG_PARAM_OPERATORE,mParamOperatore);
                fragment.setArguments(args);
                navigation = Boolean.TRUE;
                break;
            case R.id.nav_procedura_immobiliare:
                aclass = FiltroFragment.class;
                fragment = (Fragment) aclass.newInstance();
                args.putString(ARG_CHECK_CLASS,"immobiliari");
                fragment.setArguments(args);
                navigation = Boolean.TRUE;
                break;
            case R.id.nav_procedura_mobiliare:
                aclass = FiltroFragment.class;
                fragment = (Fragment) aclass.newInstance();
                args.putString(ARG_CHECK_CLASS,"mobiliari");
                fragment.setArguments(args);
                navigation = Boolean.TRUE;
                break;
            case R.id.nav_localizza_procedura:
                aclass = LocalizzaActivity.class;
                intent = Boolean.TRUE;
                break;
            case R.id.nav_ricognizione:
                aclass = RicognizioneFragment.class;
                fragment = (Fragment) aclass.newInstance();
                args.putString(ARG_PARAM_RICOGNIZIONE,""); //TODO: Add param here.
                fragment.setArguments(args);
                navigation = Boolean.TRUE;
                break;
            case R.id.nav_qrcode:
                scan = Boolean.TRUE;
                break;
            case R.id.nav_exit:
                exit = Boolean.TRUE;
                break;
        }

        if(navigation) { // Navigazione per i fragment
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
        } if(intent) { // Navigazione per le activity
            Intent myIntent = new Intent(getApplicationContext(),aclass);
            myIntent.putExtra(ARG_PARAM_OPERATORE,mParamOperatore);
            startActivity(myIntent);
            finish();
        } if(scan) {
            new MVBarcodeScanner.Builder()
                    .setScanningMode(MVBarcodeScanner.ScanningMode.SINGLE_AUTO)
                    .setFormats(Barcode.QR_CODE)
                    .build()
                    .launchScanner(MainActivity.this,REQ_CODE);
        } if(exit) { // Navigazione per l'uscita
            MaterialDialog dialog = new MaterialDialog.Builder(this)
                    .title(R.string.title_exit)
                    .content(R.string.summary_exit)
                    .positiveText(R.string.action_exit)
                    .onPositive(new MaterialDialog.SingleButtonCallback() {
                        @Override
                        public void onClick(MaterialDialog dialog, DialogAction which) {
                            finish();
                        }
                    })
                    .negativeText(R.string.action_no)
                    .show();
        }
    } catch (Exception e) {
        Log.e(this.getClass().getName(), e.getMessage(), e);
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

Редактировать:

  • Я также замечаю еще одну вещь, что переработка не единственное, что нужно дублировать.Существует также дублируемый элемент панели инструментов:

enter image description here enter image description here

Редактировать 2: - Я добавил onCreateOptionsMenu и некоторый код, который я запускаю в onCreateView:

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        //inflater.inflate(R.menu.procedura_menu_action, menu);
        inflater.inflate(R.menu.procedura_menu_list, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }


@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_procedure_list, container, false);

    Context context = view.getContext();
    setHasOptionsMenu(true);

    recyclerView = (RecyclerView) view.findViewById(R.id.rvProcedure);

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context);

    mAdapter = new ProcedureAdapter(context,procedure,this);

    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.addItemDecoration(new DividerItemDecoration(context,LinearLayoutManager.VERTICAL));
    recyclerView.setAdapter(mAdapter);

    actionModeCallback = new ActionModeCallback();

    Toolbar toolbar = view.findViewById(R.id.toolbar);
    toolbar.setTitle(getString(R.string.title_lista_procedure) + " " + mCheckClass);
    toolbar.setNavigationIcon(R.drawable.ic_menu_navigator);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    toolbar.setNavigationOnClickListener( new View.OnClickListener() {
        public void onClick(View v) {
            DrawerLayout drawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);

            if(drawerLayout.isDrawerOpen(GravityCompat.START)){
                drawerLayout.closeDrawer(GravityCompat.START);
            } else {
                drawerLayout.openDrawer(GravityCompat.START);
            }
        }
    });

    floatingActionButton = (FloatingActionButton) view.findViewById(R.id.fab_new);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            args.putString(ARG_PARAM_TIPOLOGIA,mParamTipologia); //Passa la procedura selezionata se siamo in modifica
            args.putString(ARG_PARAM_PROCEDURA,new Gson().toJson(procedure.get(lastPosition)));

            if(actionMode != null) //Leva la selezione se è presente, prima di passare ad un'altro fragment.
                enableActionMode(lastPosition);

            try {
                if ((getActivity()) != null) {
                    FragmentManager fragmentManager = ((AppCompatActivity)getActivity()).getSupportFragmentManager();
                    Class fragmentClass = ProceduraFragment.class;
                    Fragment fragment = (Fragment) fragmentClass.newInstance();
                    fragment.setArguments(args);
                    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).addToBackStack(null).commit();
                }
            } catch (java.lang.InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    });

   //TODO: Implements here the load logic for procedure.
    if(mParamProcedura != null && !(procedure.size() > 0)) {
        procedure.add(mParamProcedura);
    } else if(!(procedure.size() > 0)) {
        refreshList(AlphaMAS.getData());
    }

    return view;
}

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Зачем каждый раз создавать новый экземпляр фрагмента?Попробуйте что-то вроде этого:

if (fragment == null)
fragment = (Fragment) aclass.newInstance();
0 голосов
/ 26 сентября 2018

Внутри вашего макета в обоих Fragment s используйте это:

android:clickable="true"
android:focusable="true"
0 голосов
/ 26 сентября 2018

Решение

Установить фон для родительского макета вашего XML-файла.

android:background="@color/background_color_which_you_want"

Редактировать 1:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.procedura_menu_list, menu);
    return super.onCreateOptionsMenu(menu);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...