Перезагрузить весь фрагмент на backpress - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть AppCompatActivity, который позволяет пользователям рисовать подпись, после чего действие передает путь подписи в fragment. fragment должен поставить подпись на ImageView. fragment получает путь изображения точно правильно. Для теста, когда я помещаю путь вручную, ImageView очень хорошо показывает изображение при запуске приложения. но после того, как вы нарисовали подпись от действия, изображение не появляется на fragment.
После изучения множества часто задаваемых вопросов о стековом потоке я узнал, что компоненты fragment не обновляются после backpress из activity. На fragment есть флажок условий и положений. Даже этот checkbox остается проверенным после возвращения из activity. Потратил часы на решение этой проблемы. Не повезло.

Кодирование на стороне действия для прохождения пути изображения-

Menu1_SecondClass fragment = new Menu1_SecondClass(); 
fragment.setBoolean(true);
Bundle bundle = new Bundle();
bundle.putString("imagePath", StoredPath);  // Passing the Path
fragment.setArguments(bundle);

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.linearLayout, fragment);
ft.commit();

finish();
mFileOutStream.flush();
mFileOutStream.close();

Фрагмент бокового кодирования

public class Menu1_SecondClass extends Fragment {
    Button signatureButton;
    ImageView signImage;
    CheckBox checkBox;
    View view;
    public String image_path;
    public boolean vboolean = false;

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getActivity().setTitle("Homework Details");
    }
    public void setBoolean(Boolean boo){
        this.vboolean = boo;
    }
    public boolean getBoolean(){
        return this.vboolean;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getBoolean()){
            Toast.makeText(getActivity(), "Refreshing.. " , Toast.LENGTH_SHORT).show();
            this.setBoolean(false);
            refreshFragment();
        }
    }

    public void refreshFragment(){
        FragmentTransaction t = getActivity().getSupportFragmentManager().beginTransaction();
        t.setReorderingAllowed(false);
        t.detach(this).attach(this).commitAllowingStateLoss();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.activity_homework, container, false);

        signatureButton = (Button) view.findViewById(R.id.getSign);
        signImage = (ImageView) view.findViewById(R.id.imageViewSign);
        signatureButton.setOnClickListener(onButtonClick);
        checkBox = (CheckBox) view.findViewById(R.id.checkbox);

        //disable button if checkbox is not checked else enable button
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    signatureButton.setEnabled(true);
                } else {
                    signatureButton.setEnabled(false);
                }
            }
        });
        putSignature();

        return view;
    }

    public void putSignature(){

        Bundle bundle = this.getArguments();

        if (bundle != null) {
            image_path = bundle.getString("imagePath", "");                if(!image_path.isEmpty()) {
                Bitmap bitmap = BitmapFactory.decodeFile(image_path);
                if (bitmap != null) {
                    //bitmap = Bitmap.createScaledBitmap(bitmap, 120, 80, false);
                    signImage.setImageBitmap(bitmap);
                    Toast.makeText(getActivity(), "Image Created: " + image_path, Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getActivity(), "Null Image", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    Button.OnClickListener onButtonClick = new Button.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (checkBox.isChecked()) {
                Intent i = new Intent(getActivity(), SignatureActivity.class);
                startActivity(i);
            } else {
                signatureButton.setEnabled(false);
            }
        }
    };
}

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.framelay_loan, firstFrag);
transaction.addToBackStack(fragment.getClass().getName());
Bundle bundle = new Bundle();
bundle.putString("imagePath", imagePath);
fragment.setArguments(bundle);
transaction.commit();`

Внутри метода onCreateView

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
      View view = inflater.inflate(R.layout.fragment_micro_form1, container,false);
      Bundle bundle = this.getArguments();
        if (bundle != null) {
            image_path = bundle.getString("imagePath", ""); 
        }

        return view;
    }
0 голосов
/ 10 сентября 2018

Когда вы передаете данные из activity в fragment, вы можете использовать приведенный ниже код

Bundle bundle = new Bundle();
bundle.putString("imagePath", imagePath);
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

, и при получении данных в fragment внутри метода onCreateView вы можете написать код, подобный этому

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    String strtext = getArguments().getString("imagePath");
    return inflater.inflate(R.layout.fragment, container, false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...