当前位置: 首页 > 知识库问答 >
问题:

Android对话框不会将文本带到底层片段

艾茂学
2023-03-14
java.lang.ClassCastException: com.example.android.app.MainActivity@4c01a76must implement StatusDialogListener

然后我发现了这篇关于这个问题的文章

从读取错误和堆栈后发现,问题似乎是我必须将dialog类实现到连接到片段的活动上。

所以我在我的主要活动中实现了监听器

public class MainActivity extends AppCompatActivity implements ... Status_Dialog.StatusDialogListner
Class 'MainActivity' must either be declared abstract or implement abstract method 'applyText(String)' in 'StatusDialogListner
@Override
public void applyText(String status) {

}
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个答案

公西财
2023-03-14

问题就在这里:

@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中实现接口)

我认为您可以按以下方式更新代码:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        listner = (StatusDialogListner) context;
    } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + "must implement StatusDialogListener");
    }
}
.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);
        }
    }
});
public void setListener(StatusDialogListner newListener) {
    this.listner = newListener;
}
public void openDialog(){
    Status_Dialog status_dialog = new Status_Dialog();
    status_dialog.setListener(this); // ADD THIS NEW LINE
    status_dialog.show(getActivity().getSupportFragmentManager(), "TEST?");
}
// Remove the implementation of Status_Dialog.StatusDialogListner from MainActivity
// And remove the method below:
@Override
public void applyText(String status) {

}
 类似资料:
  • 我有一个对话框,它的文本视图很少。对于每个文本视图,我设置了不同的内容描述和文本。例如。 当我向用户显示对话框时,Talkback会读取文本(即文本编号3)而不是内容描述(即电视3)。 但是,如果我将鼠标悬停在任何文本视图上,Talkback将读取内容描述。 当对话框显示时,如何让它读取内容描述? PS:我尝试过在布局以及通过代码设置内容描述,但没有运气 提前感谢。

  • 这是我的代码,根据文档,它是用于: 我在这里找到了一个解决方案,但我并不真正理解它,因为它是用编写的,我也不理解。我需要帮助!! ---编辑----

  • 问题内容: 我尝试将我的文本与其他文章和答案中的div底部对齐,以了解Stack Overflow中的其他问题,并学会了使用不同的CSS属性来处理此问题。但是我做不到。基本上我的HTML代码是这样的: 效果是,在FF中,我仅获得垂直线(div处于折叠状态),并将文本写在其旁边。如何防止折叠但宽度适合文本? 问题答案: 弹性解决方案 如果您想使用该解决方案,那将是非常好的。但是,除了破解之外,我们还

  • 我有一个<code>BottomSheetDialogFragment</code>和一个<code>RecyclerView</code>。问题是,我想禁用<code>BottomSheetDialogFragment</code>的拖动关闭功能,只要<code>RecyclerView</code>没有向上滚动(目前我无法滚动<code>RecyclerView</code>,因为尝试将始终关

  • 问题内容: 我正在建立一个带有包含日志消息的文本框的网站。使用AJAX更新日志。 每次更新时,我需要向下滚动文本框。怎么样? 问题答案: 处理Sys.WebForms.PageRequestManager.endRequest事件,并将文本框向下滚动:

  • 似乎有很多与这个主题相关的问题。当我阅读大部分时,我有一个问题。通常人们试图制作一个片段,然后从那里生成一个对话片段。所以对话片段在片段中。 在我的例子中,我创建了一个按钮,用于打开工具栏上的dialogfragment。然后我从导航栏打开我的主要片段。因此dialogfragment和我的主片段通过相同的主活动被调用,只是在不同的地方。我无法从片段内部调用对话框片段,因为它在选择菜单选项时被调用