У меня есть 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);
}
}
};
}