首页 > 解决方案 > 如何将数据从第二个片段传递到第一个片段

问题描述

所以我正在尝试制作一个记笔记应用程序,我基本上有 1 个活动,其中有 1 个主片段打开第二个片段,因此用户可以输入数据,问题是当我将包从第二个片段发送到第一个片段时,因为如果我将 bundle get 参数放在第一个参数中,它会崩溃,我理解为什么,但我不知道如何使它不会

片段 1

package app.web.fragments.secure_note;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.analytics.FirebaseAnalytics;

import java.util.List;

import app.web.markodunovic.passwordmanager.R;
import app.web.markodunovic.passwordmanager.adapter.NoteAdapter;
import app.web.markodunovic.passwordmanager.room_note.Note;
import app.web.markodunovic.passwordmanager.view_model.NoteViewModel;

public class Secure_Notes_Fragment extends Fragment {

public static final String TAG = "BACK";
private FirebaseAnalytics mFirebaseAnalytics = FirebaseAnalytics.getInstance(getActivity());

private FloatingActionButton floatingActionButton;
private NoteViewModel noteViewModel;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (container == null) {
        return null;
    }

    View view = inflater.inflate(R.layout.fragment_secure_notes, container, false);

    RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setHasFixedSize(true);

    NoteAdapter noteAdapter = new NoteAdapter();
    recyclerView.setAdapter(noteAdapter);

    noteViewModel = new ViewModelProvider(getActivity()).get(NoteViewModel.class);
    noteViewModel.getAllNotes().observe(getActivity(), new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            //update recycler view
            //Toast.makeText(getActivity(), "On Changed", Toast.LENGTH_SHORT).show();
            // it works yey
            noteAdapter.setNotes(notes);
        }
    });

    floatingActionButton = view.findViewById(R.id.button_add_note);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            fire(mFirebaseAnalytics);
            //Toast.makeText(getContext(), "I Dun Been Clicked", Toast.LENGTH_SHORT).show();
            //getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new PassWord_Fragment()).commit();
            newFragment();

        }
    });

    passedData();

    return view;
}

private void passedData() {
    Bundle bundle = this.getArguments();
    if (!bundle.isEmpty()){
        String title = bundle.getString("title");
        String description = bundle.getString("description");
        int value = bundle.getInt("number");
        Toast.makeText(getContext(), ""+title+description+value, Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(getContext(), "Bundle Empty", Toast.LENGTH_SHORT).show();
    }
}

private void newFragment() {

    //sends data need to use bundle instead of intent in fragments
    Bundle bundle = new Bundle();
    bundle.putString("test","the test works");
    NoteAddEditFragment noteAddEditFragment = new NoteAddEditFragment();
    noteAddEditFragment.setArguments(bundle);

    FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager()
            .beginTransaction().replace(R.id.fragment_container,noteAddEditFragment).addToBackStack(TAG);
        noteAddEditFragment.setArguments(bundle);
    fragmentTransaction.commit();
}

private void fire(FirebaseAnalytics mFirebaseAnalytics) {

    Bundle firebaseAnalytics = new Bundle();
    firebaseAnalytics.putString(FirebaseAnalytics.Param.SCREEN_NAME, "clicked fab button switched to NoteAddEditFragment");
    firebaseAnalytics.putString(FirebaseAnalytics.Param.SCREEN_CLASS, "NoteAddEditFragment");
    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, firebaseAnalytics);

}
}

片段 2

package app.web.fragments.secure_note;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.Toast;
import android.widget.Toolbar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import java.util.Objects;

import app.web.markodunovic.passwordmanager.R;

public class NoteAddEditFragment extends Fragment {
    private EditText editTextTitle, editTextDescription;
    private NumberPicker numberPicker;
    private Button buttonBack, buttonSave;

    public static final String TITLE = "title";
    public static final String DESCRIPTION = "description";
    public static final String NUMBERPICKER = "number";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    if (container==null){
        return null;
    }
    View view = inflater.inflate(R.layout.fragment_secure_notes_edit_update,container,false);

    setButtons(view);

    checkPassedVallue();

    return view;

}

private void setButtons(View view) {
    editTextTitle = view.findViewById(R.id.edit_text_title);
    editTextDescription = view.findViewById(R.id.edit_text_description);
    numberPicker = view.findViewById(R.id.number_picker_priority);
    numberPicker.setMinValue(1);
    numberPicker.setMaxValue(100);
    buttonBack = view.findViewById(R.id.notes_back_button);
    buttonBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getContext(), "Note not saved", Toast.LENGTH_SHORT).show();
            FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager()
                    .beginTransaction().replace(R.id.fragment_container,new Secure_Notes_Fragment());
            fragmentTransaction.commit();
        }
    });
    buttonSave = view.findViewById(R.id.notes_save_button);
    buttonSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String title = editTextTitle.getText().toString().trim();
            String description = editTextDescription.getText().toString().trim();
            int numberP = numberPicker.getValue();

            if (!title.isEmpty() && !description.isEmpty() && numberP > 0){
                //Toast.makeText(getContext(), "ok", Toast.LENGTH_SHORT).show();
                Bundle bundle = new Bundle();
                bundle.putString(TITLE,title);
                bundle.putString(DESCRIPTION,description);
                bundle.putInt(NUMBERPICKER,numberP);

                Secure_Notes_Fragment secure_notes_fragment = new Secure_Notes_Fragment();
                FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager()
                        .beginTransaction().replace(R.id.fragment_container,secure_notes_fragment);
                secure_notes_fragment.setArguments(bundle);
                fragmentTransaction.commit();

            }else{
                Toast.makeText(getContext(), "Cant Be Empty", Toast.LENGTH_SHORT).show();
            }

        }
    });
}

private void checkPassedVallue() {
    Bundle bundle = this.getArguments();
    String passedVallue = bundle.getString("test");
    Toast.makeText(getContext(), "this is the passed vallue: " + passedVallue, Toast.LENGTH_SHORT).show();
}


}

标签: javaandroidandroid-fragmentsfragment

解决方案


推荐阅读