BackPress возвращается к пустой активности - PullRequest
0 голосов
/ 04 октября 2018

Я включил сканер штрих-кода в моем приложении.У меня есть активность, которая содержит несколько фрагментов.В одном фрагменте у меня есть кнопка сканирования штрих-кода, и при нажатии этой кнопки она переходит к операции сканирования для сканирования кода и возвращается к фрагменту с кодом.

Но проблема заключается в том, что когда я получаю, то открываетдиалоговое окно с предыдущим фрагментом с кодом, и когда я нажимаю на кнопку назад на панели инструментов из этого текущего фрагмента, отображается белая пустая активность.

 @Override
public void handleResult(me.dm7.barcodescanner.zbar.Result result) {


    String resultCode = result.getContents();

    Log.e("TAG", "handleResult: " + resultCode);
    mScannerView.stopCamera();
    modelProductArticleCodeList = new ArrayList<>();
    modelProductArticleCodeList = databaseHelper.getProductByArtCode(resultCode);


    if (modelProductArticleCodeList.size() == 0) {

        Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(getApplicationContext().VIBRATOR_SERVICE);
        vibrator.vibrate(1000);


        singleUnrecognisedCheck = new ArrayList<>();

        singleUnrecognisedCheck = databaseHelper.getUnrecognisedByCode(resultCode);

        if (singleUnrecognisedCheck.size() == 0) {

            Intent in = new Intent(this, ContainAllFragmentsActivity.class);
            in.putExtra("unrecognised_alert", true);
            in.putExtra("unrecognised_code", resultCode);
            in.putExtra("jump", "1");
            in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(in);
            finishAffinity();
            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);
            //  Toast.makeText(this, "not matched code", Toast.LENGTH_SHORT).show();

        } else {
            Intent in = new Intent(this, ContainAllFragmentsActivity.class);
            in.putExtra("jump", "3");
            in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(in);
            finishAffinity();
            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);
            Toast.makeText(this, R.string.unrecognised_code_has_been_added, Toast.LENGTH_SHORT).show();
        }


    } else {

       }

        Intent in = new Intent(this, ContainAllFragmentsActivity.class);

        in.putExtra("product_art", resultCode);
        in.putExtra("source_type", "art");
        in.putExtra("jump", "2");
        in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(in);
        finishAffinity();
        int pid = android.os.Process.myPid();
        android.os.Process.killProcess(pid);

    }
}

И в зависимости от ключевых параметров и значения в намеренной операции переключается на конкретный фрагмент.

if (switchTonext.equals("1")) {
            Fragment fragment = new SearchProductFragment();
            FragmentManager fragmentManager = getSupportFragmentManager(); // this is basically context of the class
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            Bundle bundle = new Bundle();

            bundle.putBoolean("unrecognised_alert", unrecognised_alert);
            bundle.putString("unrecognised_code", getIntent().getStringExtra("unrecognised_code"));

            fragment.setArguments(bundle);
            fragmentTransaction.replace(R.id.frame, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }

Чтобы решить эту проблему, я сделал некоторые изменения в onBackPressed в активности и жестко запрограммировал, что если фрагмент является экземпляром этого текущего фрагмента, то при нажатии кнопки «назад» переход к предыдущему.

  @Override
public void onBackPressed() {

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.frame);
    if (!(f instanceof SearchShopFragment)) {
        if (f instanceof SearchProductFragment) {
            changeFragments(new SearchShopFragment());
        }
        else if(f instanceof ProductDetailFragment){
            changeFragments(new SearchProductFragment());
        }
        else {
            super.onBackPressed();
        }
    } else {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
        alertDialog.setMessage(R.string.exit_msg);
        alertDialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                moveTaskToBack(true);
                android.os.Process.killProcess(android.os.Process.myPid());
                finish();
            }
        });
        alertDialog.setNegativeButton(R.string.no
                , new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        alertDialog.show();
    }

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

Пожалуйста, помогите !!Как я могу решить эти две проблемы.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Попробуйте это в onBackPressed:

FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frame);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}
0 голосов
/ 04 октября 2018

Существует два способа решения этой проблемы: 1) поместить логику кода сканирования в тот же фрагмент, в котором вы выполняете действие после нажатия кнопки «Сканирование» (избегать действия сканирования). (Когда нажата кнопка, сделайте ее невидимойи видим пользовательский интерфейс для кода сканирования).") перед его уничтожением и вызовом ContainAllFragmentsActivity, и загружает тот же фрагмент, который установлен в теге.Для этого используйте getIntent (). GetExtra () ...

...