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

如何让片段A知道片段B中的按钮已按下

轩辕奕
2023-03-14

有点复杂,但我会尽力解释。我有3个碎片。第一个片段(NoteFragment)保存所有注释的recycler视图。第二个片段(AddNoteFragment)在我单击AddNote按钮时打开,这是第一个片段中的按钮。第三个片段(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());
                    }
                }
            });
        }
    }
}

我想要什么?我想要,一旦我点击了IVRemveNote,这是在删除NoteFrach里面,我的NoteFrach知道这一点,我可以在它里面做的动作(在注意片段)。

或者,如果你有另一种删除便条的方法,我很想听听。

请注意,为了删除注释,我使用注释适配器内部的侦听器,它接受keys数组列表位置。

共有3个答案

墨宜人
2023-03-14

您应该考虑使用架构组件中的LiveData和ViewModel,这是谷歌推荐的设计模式。这需要一点时间来掌握窍门,但你几乎可以在每一个应用程序中使用它,这会让你的问题变得非常简单。例如,请参见以下概述。这是一个非常好的YouTube教程,它准确地描述了你的笔记示例,不是针对Firebase,而是针对Android Room(本地数据库而不是云)。这有点长,但你会有一个很好的理解之后。

基本上,您可以从Firebase数据库查询所有笔记以接收LiveData

然后,您可以观察LiveData allNotes来获取列表,并将其设置为您的回收器视图。这样,您的回收器视图中总是有最新的数据。当您从数据库中删除注释时,它将自动更新列表并在回收器视图中显示。

黄锋
2023-03-14

希望这些片段是由同一个活动托管的。您可以通过((YourActivityClassName)getActive())从片段调用活动的方法。你的公共方法();

在那里你可以写你的逻辑来调用片段方法,侦听器或其他什么

潘雅珺
2023-03-14

可以做的一件事是在NoteFragment中创建一个方法,然后在按下RemoveNoteFragment中的IVremoveNote时调用该方法。在此方法中,可以添加删除节点/行的功能。小费!-可以在方法参数中传递注释/行信息。我希望有帮助。

 类似资料:
  • 问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。

  • 我在弄清楚碎片是如何工作的。我有3个类,MainActivity,Fragment1和fragment2。 MainActivity扩展了 Fragment2还扩展了SherlockFragment,但什么也不做,将它膨胀为空。xml

  • 我想从片段到活动使用返回按钮使用工具栏返回图标。 碎片是我的抽屉菜单项 我该怎么做?

  • 我使用这个代码来替换片段,但有一个问题,它不是替换旧片段,它只是覆盖旧片段,所以请告诉我这里有什么问题。

  • 我合并了一个水平幻灯片导航组件(这需要使类扩展片段)。滑动部分工作正常。这里我有相应的<code>onClick() 到目前为止,我的代码还不多,所以我不会用相关的布局部分来混淆我的问题。任何帮助都是非常感谢的。 片段#1的Java代码 public class TasksFragment扩展Fragment { @ Override public View oncreate View(layou

  • 我有一个活动是持有5个片段。其中一个片段是持有5更多的碎片。如果我添加到片段管理器a. addToBackStack(空)。返回按钮返回到活动的最后一个片段,而不是从“父亲”片段的最后一个片段(即持有5更多的片段)。 有什么帮助吗。。 编辑: