简体   繁体   English

setArguments() 在将数据传递给 Fragment 时不起作用

[英]setArguments() not working while passing data to Fragment

I'm new to Android development, I'm trying to implement a music player.我是 Android 开发的新手,我正在尝试实现音乐播放器。 I tried to implement a Fragment which there, if the user would clicks on "delete", the selected index would be deleted from the ArrayList and gone from the RecyclerView.我试图实现一个片段,如果用户点击“删除”,则所选索引将从 ArrayList 中删除并从 RecyclerView 中消失。

When app reaches onClick anonymous function, it crashes at the assignment of "position" variable, indicating "Null Pointer Exception".当应用程序到达 onClick 匿名函数时,它在“位置”变量的分配处崩溃,指示“空指针异常”。

I attached MainActivity.java and DeleteFragment.java to this thread.我将 MainActivity.java 和 DeleteFragment.java 附加到这个线程。 Thank you!谢谢!


public class MainActivity extends AppCompatActivity {

    static ArrayList<SongModel> songModelArrayList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView songsRV = findViewById(R.id.activity_main_recycler);
        songsRV.setHasFixedSize(true);
        songsRV.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        songModelArrayList = new ArrayList<SongModel>();
        songModelArrayList.add(new SongModel("Bob Dylan", "One More Cup Of Coffee", "https://www.syntax.org.il/xtra/bob.m4a", R.drawable.bob1));
        songModelArrayList.add(new SongModel("Bob Dylan", "Sara", "https://www.syntax.org.il/xtra/bob1.m4a", R.drawable.bob2));
        songModelArrayList.add(new SongModel("Bob Dylan", "The Man In Me", "https://www.syntax.org.il/xtra/bob2.mp3", R.drawable.bob3));

        SongAdapter songAdapter = new SongAdapter(this, songModelArrayList);

        ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP|ItemTouchHelper.DOWN, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                if(direction == ItemTouchHelper.RIGHT || direction == ItemTouchHelper.LEFT){

                    DeleteFragment deleteFragment = new DeleteFragment();
                    Bundle args = new Bundle();

                    args.putParcelableArrayList("arrayList", songModelArrayList);
                    int position = viewHolder.getAdapterPosition();
                    args.putInt("position", position);

                    deleteFragment.setArguments(args);

                    getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, 0, 0, R.anim.exit_from_left).add(R.id.fragment_container, new DeleteFragment(), null).addToBackStack("Delete").commit();

             
                }
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(songsRV);

        songsRV.setAdapter(songAdapter);

    }
}
public class DeleteFragment extends Fragment {

    public DeleteFragment() {
        // Required empty public constructor
    }

    public static DeleteFragment newInstance(ArrayList<SongModel> songs){
        DeleteFragment deleteFragment = new DeleteFragment();
        Bundle args = new Bundle();
        args.putParcelableArrayList("arrayList", songs);
        deleteFragment.setArguments(args);
        return deleteFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_delete, container, false);

        FloatingActionButton floatingActionButton = view.findViewById(R.id.exit_btn);
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

        MaterialButton cancelBtn = view.findViewById(R.id.cancel_btn);
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

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

                Bundle args = getArguments();

                int position = args.getInt("position");

                ArrayList<SongModel> changedSongArrayList = getArguments().getParcelableArrayList("arrayList");
                changedSongArrayList.remove(position);
                changedSongArrayList.notifyAll();

                if(requireActivity().getSupportFragmentManager().getBackStackEntryCount() > 0)
                    requireActivity().getSupportFragmentManager().popBackStack();
            }
        });

        return view;
    }
}

In line getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, 0, 0, R.anim.exit_from_left).add(R.id.fragment_container, new DeleteFragment(), null).addToBackStack("Delete").commit();在线getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter_from_right, 0, 0, R.anim.exit_from_left).add(R.id.fragment_container, new DeleteFragment(), null).addToBackStack("Delete").commit(); you are creating new Deletefragment instead of using already created one with arguments您正在创建新的Deletefragment而不是使用已创建的带参数的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM