Как заставить фрагмент A знать, что кнопка во фрагменте B нажата - PullRequest
1 голос
/ 23 октября 2019

немного сложно, но я постараюсь объяснить. У меня есть 3 фрагмента. Первый фрагмент (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());
                    }
                }
            });
        }
    }
}

Что я хочу? Я хочу, чтобы после того, как я щелкну на IVremoveNote, который находится внутри RemoveNoteFragment, мой NoteFragment знает об этом, и я могу выполнять действия внутри него (в NoteFragment).

Или, если у вас есть другое решение для удаления заметки,Я хотел бы услышать.

Обратите внимание, что для удаления заметки я использую прослушиватель внутри адаптера заметки, который принимает позицию списка массивов ключей.

Ответы [ 3 ]

1 голос
/ 23 октября 2019

Одна вещь, которую вы можете сделать, это создать метод в NoteFragment, а затем вызвать метод при нажатии IVremoveNote в RemoveNoteFragment. В этом методе вы можете добавить функциональность для удаления узла / строки. Чаевые! - вы можете передать информацию примечания / строки в аргументе метода. Надеюсь, это поможет.

0 голосов
/ 23 октября 2019

Вам действительно следует подумать об использовании LiveData и ViewModel из компонентов Architecture для ваших целей, что является рекомендуемым шаблоном проектирования Google. Требуется немного времени, чтобы освоить его, но вы можете использовать его практически для любого приложения, и это действительно облегчит вашу проблему. См., Например, следующий обзор . Здесь - очень хороший учебник YouTube, который точно описывает ваш пример заметки, не для Firebase, а для Android Room (локальная база данных вместо облака). Это немного длинно, но потом у вас будет хорошее понимание.

В основном из вашей базы данных Firebase вы запрашиваете все заметки, чтобы получить LiveData> allNotes

Затем вы можете наблюдать все заметки LiveData, чтобы получитьсписок и установите его в свой RecyclerView. Таким образом, вы всегда будете иметь самые последние данные в своем обзоре переработчика. Когда вы удаляете заметку из БД, она автоматически обновит список и покажет его в программе recyclerview.

0 голосов
/ 23 октября 2019

Надеюсь, что эти фрагменты размещены в той же деятельности. Вы можете вызвать метод действия из фрагмента как ((YourActivityClassName)getActivity()).yourPublicMethod();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...