Диалог Android не будет приводить текст к нижележащему фрагменту - PullRequest
1 голос
/ 20 мая 2019

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

java.lang.ClassCastException: com.example.android.app.MainActivity@4c01a76must implement StatusDialogListener

Затем я обнаружил это сообщение стека , говорящее о проблеме

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

Поэтому я внедрил слушателя в свою основную деятельность

public class MainActivity extends AppCompatActivity implements ... Status_Dialog.StatusDialogListner

После его реализации я получил ошибку ниже:

Class 'MainActivity' must either be declared abstract or implement abstract method 'applyText(String)' in 'StatusDialogListner

Я исправил это, добавив приведенный ниже код в Activity:

@Override
public void applyText(String status) {

}

Thisпозволяет приложению запускать и отображать диалоговое окно без ошибок.Проблема в том, что теперь мой адаптер не будет получать текст из диалогового окна, поэтому я считаю, что это связано с тем фактом, что у меня также есть applyText в моем фрагменте, и основная активность при запуске отладчика applytext во фрагменте быланикогда не звонил.В этот момент я потерян

Код

Диалог

public class Status_Dialog extends AppCompatDialogFragment {

    private EditText editTextStatus;
    private StatusDialogListner listner;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        View view = inflater.inflate(R.layout.layout_status_dialog, null);

        editTextStatus = view.findViewById(R.id.new_status);
        builder.setView(view)
                .setTitle("Change Status")
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                })
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String status = editTextStatus.getText().toString();
                        listner.applyText(status);
                    }
                });
        return builder.create();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            listner = (StatusDialogListner) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement StatusDialogListener");
        }
    }

    public interface StatusDialogListner {
        void applyText(String status);
    }
}

Фрагмент

    public class profile_fragment extends Fragment implements Status_Dialog.StatusDialogListner {

        private static final int GALLERY_PICK = 1;
        private DatabaseReference mUserDatabase;

        //Android Layout
        private FirebaseUser mCurrentUser;
        private CircleImageView mDisplayImage;
        private TextView mName;
        private TextView mStatus;
        private Button mStatusBtn;
        private Button mImageBtn;
        private ProgressDialog mProgressDialog;
        private StorageReference mImageStorage;

        private FirebaseFirestore db = FirebaseFirestore.getInstance();

        private FirebaseAuth mAuth;
        private FirebaseAuth.AuthStateListener mAuthListner;

        private static final String KEY_NAME = "name";
        private static final String KEY_STATUS = "status";
        private static final String KEY_IMAGE = "image";

        private static final String TAG = "user_profile";

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

            mDisplayImage = view.findViewById(R.id.profile_picture);
            mName = view.findViewById(R.id.profile_user_name);
            mStatus = view.findViewById(R.id.profile_user_status);
            mStatusBtn = view.findViewById(R.id.profile_change_status_btn);
            mImageBtn = view.findViewById(R.id.profile_change_image_btn);

            mImageStorage = FirebaseStorage.getInstance().getReference();
            mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
            final String current_uid = mCurrentUser.getUid();

            DocumentReference mUsersDB = db.collection("Users").document(current_uid);

            // FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser() ;
            // Toast.makeText(this, "ttt" + currentFirebaseUser.getUid(), Toast.LENGTH_SHORT).show();
            mStatusBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    openDialog();
                    /*
                    String status_value = mStatus.getText().toString();
                    Intent status_intent = new Intent(getActivity(), change_status.class);
                    status_intent.putExtra("status_value", status_value);
                    startActivity(status_intent);
                    */
                }
            });

            mImageBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent galleryIntent = new Intent();
                    galleryIntent.setType("image/*");
                    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(galleryIntent, "Select Image"), GALLERY_PICK);
                    /*
                    CropImage.activity()
                            .setGuidelines(CropImageView.Guidelines.ON)
                            .start(SettingsActivity.this);
                    */
                }
            });

            mUsersDB.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                        @Override
                        public void onSuccess(DocumentSnapshot documentSnapshot) {
                            if (documentSnapshot.exists()) {
                                String name = documentSnapshot.getString(KEY_NAME);
                                mName.setText(name);
                                String status = documentSnapshot.getString(KEY_STATUS);
                                mStatus.setText(status);
                                FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
                            } else {
                            }
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                        }
                    });
            return view;
        }

        public void openDialog(){
            Status_Dialog status_dialog = new Status_Dialog();
            status_dialog.show(getActivity().getSupportFragmentManager(), "TEST?");
        }

        @Override
        public void applyText(String status) {
            mStatus.setText(status);
        }
...

1 Ответ

0 голосов
/ 20 мая 2019

Проблема здесь:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        listner = (StatusDialogListner) context;
    } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement StatusDialogListener");
    }
}

Обратите внимание, что listner установлен во время onAttach, и он получает экземпляр Context. Другими словами, он получает экземпляр активности хоста (поэтому вам пришлось реализовать интерфейс в MainActivity)

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

1) Удалите это из диалога. Таким образом, ваша деятельность больше не должна реализовывать StatusDialogListener

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        listner = (StatusDialogListner) context;
    } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement StatusDialogListener");
    }
}

2) Обновите это в диалоге:

.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        if(listner != null) { // ADD THIS NULL CHECK SINCE LISTNER MAY BE NULL
            String status = editTextStatus.getText().toString();
            listner.applyText(status);
        }
    }
});

3) Добавьте это в диалог:

public void setListener(StatusDialogListner newListener) {
    this.listner = newListener;
}

4) Обновить это фрагмент:

public void openDialog(){
    Status_Dialog status_dialog = new Status_Dialog();
    status_dialog.setListener(this); // ADD THIS NEW LINE
    status_dialog.show(getActivity().getSupportFragmentManager(), "TEST?");
}

5) Удалить приведенный ниже код из MainActivity

// Remove the implementation of Status_Dialog.StatusDialogListner from MainActivity
// And remove the method below:
@Override
public void applyText(String status) {

}
...