java - 如何让片段A知道片段B中的按钮被按下
问题描述
有点复杂,但我会尝试解释。我有3个片段。First Fragment (NoteFragment) 持有所有笔记的回收者视图。当我单击添加注释按钮时,第二个片段(AddNoteFragment)打开,这是第一个片段中的这个按钮。第三个片段(RemoveNoteFragment)是在我单击其中一个注释后出现的片段。(我在 NoteAdapter 中有一个监听器)。
第一个片段和第二个片段出现在相同的框架布局中。在第二个片段中,我有一个按钮,一旦单击它,我就想删除注释(从回收器视图和 firebase 中-请参阅代码我是如何做到的)。
笔记片段
public class NoteFragment extends Fragment implements View.OnClickListener {
private RecyclerView RVNotesList;
private ArrayList<Note> notes = new ArrayList<>();
private NotesAdapter adapter;
private ImageView mAddNoteBTN;
private Note note;
private ArrayList<String> keys = new ArrayList<>();
private FirebaseAuth mAuth;
private FirebaseDatabase db;
private DatabaseReference users;
private RecyclerView.LayoutManager layoutManager;
private Fragment removeFragment;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main_notes, container, false);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
removeFragment = new RemoveNoteFragment();
mAuth = FirebaseAuth.getInstance();
db = FirebaseDatabase.getInstance();
users = db.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("Notes");
mAddNoteBTN = view.findViewById(R.id.addNoteBTN);
mAddNoteBTN.setOnClickListener(this);
RVNotesList = view.findViewById(R.id.RVNotesList);
users.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
notes.clear();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
note = dataSnapshot1.getValue(Note.class);
notes.add(note);
keys.add(dataSnapshot1.getKey());
}
adapter = new NotesAdapter(notes, getActivity(), keys);
if (adapter.getItemCount() <= 3) {
layoutManager = new GridLayoutManager(getActivity(), 1);
} else {
layoutManager = new GridLayoutManager(getActivity(), 3);
}
RVNotesList.setLayoutManager(layoutManager);
RVNotesList.setAdapter(adapter);
adapter.setOnNoteClickListener(new NotesAdapter.OnNoteClickListener() {
@Override
public void onNoteClick(final int position) {
getFragmentManager().beginTransaction().replace(R.id.bottom_container, removeFragment)
.commit();
String key = keys.get(position);
users.child(key).removeValue();
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.addNoteBTN:
getFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_left_to_right, R.anim.exit_left_to_right).replace(R.id.bottom_container, new AddNoteFragment())
.commit();
break;
}
}
}
添加笔记片段
public class AddNoteFragment extends Fragment implements View.OnClickListener, AddNotePresenter {
private EditText ETnoteTitle, ETnoteDesc;
private TextView TVnoteLastDate;
private Button saveNoteBTN, deleteNoteBTN, BTNtaskDatePicker;
private Note note;
private int day;
private int month;
private int year;
private Calendar c;
private DatePickerDialog dpd;
private AddNoteView addNoteView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_note, container, false);
addNoteView = new AddNoteView(this);
ETnoteTitle = view.findViewById(R.id.noteTitle);
ETnoteDesc = view.findViewById(R.id.noteDesc);
TVnoteLastDate = view.findViewById(R.id.TVnoteLastDate);
BTNtaskDatePicker = view.findViewById(R.id.taskDatePicker);
BTNtaskDatePicker.setOnClickListener(this);
saveNoteBTN = view.findViewById(R.id.saveNoteBTN);
saveNoteBTN.setOnClickListener(this);
deleteNoteBTN = view.findViewById(R.id.deleteNoteBTN);
deleteNoteBTN.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.saveNoteBTN:
saveNote();
hideKeyboard(getActivity());
break;
case R.id.deleteNoteBTN:
removeAddNoteFragment();
hideKeyboard(getActivity());
break;
case R.id.taskDatePicker:
showDatePicker();
break;
}
}
@Override
public void removeAddNoteFragment() {
getFragmentManager().beginTransaction().
remove(getFragmentManager().findFragmentById(R.id.bottom_container)).commit();
}
public void showDatePicker() {
c = Calendar.getInstance();
day = c.get(Calendar.DAY_OF_MONTH);
month = c.get(Calendar.MONTH);
year = c.get(Calendar.YEAR);
dpd = new DatePickerDialog(getActivity(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int mYear, int mMonth, int mDay) {
day = mDay;
month = mMonth + 1;
year = mYear;
TVnoteLastDate.setText(mDay + "/" + (mMonth + 1) + "/" + mYear);
}
}, day, month, year);
dpd.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
dpd.show();
}
public void saveNote() {
String title = ETnoteTitle.getText().toString().trim();
String desc = ETnoteDesc.getText().toString().trim();
String date = TVnoteLastDate.getText().toString().trim();
if (title.isEmpty() || desc.isEmpty() || date.isEmpty()) {
return;
}
note = new Note(title, desc, day, month, year);
addNoteView.pushNote(note);
}
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
删除笔记片段
public class RemoveNoteFragment extends Fragment{
private ImageView IVremoveNote;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_remove_note, container, false);
IVremoveNote = view.findViewById(R.id.IVremoveNote);
return view;
}
}
注意适配器
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NotesViewHolder> {
private ArrayList<Note> notes;
private Context context;
private ArrayList<String> keys;
private OnNoteClickListener onNoteClickListener;
public NotesAdapter(ArrayList<Note> notes, Context context, ArrayList<String> k) {
this.notes = notes;
this.context = context;
this.keys = k;
}
public interface OnNoteClickListener {
void onNoteClick(int position);
}
public void setOnNoteClickListener(OnNoteClickListener onNoteClickListener) {
this.onNoteClickListener = onNoteClickListener;
}
@NonNull
@Override
public NotesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_list_item, parent, false);
return new NotesAdapter.NotesViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final NotesViewHolder holder, final int position) {
final Note note = notes.get(position);
holder.TVnoteCardTitle.setText(notes.get(position).getmNoteTitle());
holder.TVnoteCardDesc.setText(notes.get(position).getmNoteDescription());
String lastDayToConfirmNote = (notes.get(position).getmDay() + "/"
+ notes.get(position).getmMonth() + "/" + notes.get(position).getmYear());
holder.TVnoteCardLastDate.setText(lastDayToConfirmNote);
}
@Override
public int getItemCount() {
return notes.size();
}
public class NotesViewHolder extends RecyclerView.ViewHolder {
private TextView TVnoteCardTitle;
private TextView TVnoteCardDesc;
private TextView TVnoteCardLastDate;
public NotesViewHolder(@NonNull View itemView) {
super(itemView);
TVnoteCardTitle = itemView.findViewById(R.id.TVnoteCardTitle);
TVnoteCardDesc = itemView.findViewById(R.id.TVnoteCardDesc);
TVnoteCardLastDate = itemView.findViewById(R.id.TVnoteCardLastDate);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onNoteClickListener != null) {
onNoteClickListener.onNoteClick(getAdapterPosition());
}
}
});
}
}
}
我想要什么 ?我希望一旦单击 RemoveNoteFragment 内的 IVremoveNote,我的 NoteFragment 就知道这一点,并且我可以在其中执行操作(在 NoteFragment 中)。
或者,如果您有其他删除笔记的解决方案,我很想听听。
请注意,为了删除便笺,我使用便笺适配器内的侦听器,它接受键数组列表位置。
解决方案
您可以做的一件事是在 NoteFragment 中创建一个方法,然后在按下 RemoveNoteFragment 中的 IVremoveNote 时调用该方法。在此方法中,您可以添加删除节点/行的功能。小费!- 您可以在方法参数中传递注释/行信息。我希望它有所帮助。
推荐阅读
- python - Python中缺少运算符的计算器
- google-apps-script - 您如何仅向 Google 电子表格中的工作表所有者授予编辑权限?
- javascript - 如何让 discord bot 在 discord.js 中发送消息后产生表情符号反应?
- java - java json post请求使用HttpURLConnection和nodejs服务器
- java - jakarta.xml.bind.annotation.XmlRootElement 是否可用?
- python-3.x - 如何将十六进制字符串转换为字节
- google-apps-script - google app slides pageElements bringToFront 似乎是随机的
- excel - 根据单元格中指定的数量打印
- javascript - CSS - 整页上的 SVG [Anime JS]
- java - 如何使 JFrame 居中?