【问题标题】:How do I send data from fragment to another activity [duplicate]如何将数据从片段发送到另一个活动 [重复]
【发布时间】:2020-03-29 03:12:02
【问题描述】:

在我的应用程序中,我有一个在片段内具有 recyclerview 的活动,并且 recycleview 从云存储 Firebase 检索数据。我想打开新活动,该活动将根据用户单击的链接(显示在回收站视图上)检索数据。 如何获取数据并在新活动中显示?

从 ForumTitle.java > 显示 ReviewFragment.java > 用户单击一个值 > 显示 ForumInterface.java

论坛标题.java

public class ForumTitle extends AppCompatActivity {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();


    ImageButton IVReview,IVTechnical,IVHardware;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_forum_title);

        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment selectedFragment = null;
                if (v == findViewById(R.id.iBReview)){
                    selectedFragment = new ReviewFragment();
                }
                else if (v == findViewById(R.id.iBTech)){
                    selectedFragment = new TechnicalSupportFragment();
                }
                else if (v == findViewById(R.id.iBHardware)){
                    selectedFragment = new HardwareFragment();
                }
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction transaction = manager.beginTransaction();
                transaction.replace(R.id.fragment_container,selectedFragment);
                transaction.commit();
            }

        };
        IVReview = (ImageButton)findViewById(R.id.iBReview);
        IVTechnical = (ImageButton)findViewById(R.id.iBTech);
        IVHardware = (ImageButton)findViewById(R.id.iBHardware);
        IVReview.setOnClickListener(listener);
        IVTechnical.setOnClickListener(listener);
        IVHardware.setOnClickListener(listener);
    }
}

ReviewFragment.java

public class ReviewFragment extends Fragment {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference userRef = db.collection("Review");
    private ForumAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view =  inflater.inflate(R.layout.fragment_review,container,false);
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        Query query = userRef.orderBy("DatePosted",Query.Direction.DESCENDING);
        FirestoreRecyclerOptions<Forum> options = new
                FirestoreRecyclerOptions.Builder<Forum>()
                .setQuery(query,Forum.class)
                .build();
        adapter = new ForumAdapter(options);
        RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.rvReview);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this.getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);

        adapter.setOnItemClickListener(new ForumAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
                Forum forum = documentSnapshot.toObject(Forum.class);
                String title = forum.getTitle();
                String id = documentSnapshot.getId();
                Intent intent = new Intent(getActivity(), ForumInterface.class);
                Bundle extras = intent.getExtras();
                extras.putString("FORUM_TYPE","Review");
                extras.putString("FORUM_ID",id);
                extras.putString("TITLE",title);
                startActivity(intent);
            }
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }

论坛接口.java

public class ForumInterface extends AppCompatActivity {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    String forum_title = extras.getString("TITLE");
    String forum_type = extras.getString("FORUM_TYPE");
    String forum_id = extras.getString("FORUM_ID");
    private CollectionReference userRef = db.collection(forum_type).document(forum_id).collection(forum_title);
    private ForumAdapter adapter;


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


        TextView test = (TextView)findViewById(R.id.tvForumTitle);
        test.setText(forum_title);
    }
}

论坛适配器.java

public class ForumAdapter extends FirestoreRecyclerAdapter<Forum,ForumAdapter.ForumHolder> {
    private OnItemClickListener listener;

    public ForumAdapter(FirestoreRecyclerOptions<Forum> options) {
        super(options);
    }

    @Override
    public void onBindViewHolder(ForumHolder forumHolder, int i, Forum forum) {
        forumHolder.textViewTitle.setText(forum.getTitle());
        forumHolder.textViewDescription.setText(forum.getDescription());
        forumHolder.timeStamp.setText(forum.getDatePosted().toString());
    }

    @NonNull
    @Override
    public ForumHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        android.view.View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardviewforumtitle,parent,false);
        return new ForumHolder(v);
    }
    class ForumHolder extends RecyclerView.ViewHolder{
        TextView textViewTitle;
        TextView textViewDescription;
        TextView timeStamp;
        public ForumHolder(View itemView) {
            super(itemView);
            textViewTitle = itemView.findViewById(R.id.title);
            textViewDescription = itemView.findViewById(R.id.description);
            timeStamp = itemView.findViewById(R.id.timestamp);

            textViewTitle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    // NO_POSITION to prevent app crash when click -1 index
                    if(position != RecyclerView.NO_POSITION && listener !=null ){
                        listener.onItemClick(getSnapshots().getSnapshot(position),position);
                    }
                }
            });
        }
    }
    public interface OnItemClickListener{
        void onItemClick(DocumentSnapshot documentSnapshot, int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener = listener;
    }
    @Override
    public int getItemCount() {
        return super.getItemCount();
    }
}

使用上面的代码运行它,我得到一个错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putString(java.lang.String, java.lang.String)' on a null object reference

at my.edu.fsktm.um.finalproject.Fragment.ReviewFragment$1.onItemClick(ReviewFragment.java:61)
at my.edu.fsktm.um.finalproject.ForumTitle.ForumAdapter$ForumHolder$1.onClick(ForumAdapter.java:56)

我的应用程序的图片

当我点击标题“GTX 1660 Ti Gaming X”时

【问题讨论】:

    标签: java android android-fragments google-cloud-firestore


    【解决方案1】:

    您尝试在ReviewFragmentonClick 中的null 上设置内容。使用new Bundle() 而不是intent.getExtras(); 来实例化Bundle

    Bundle extras = new Bundle();
    extras.putString("FORUM_TYPE","Review");
    extras.putString("FORUM_ID",id);
    extras.putString("TITLE",title);
    
    //You have to set the bundle to intent
    intent.putExtras(extras);
    startActivity(intent);
    

    除了这个移动到ForumInterface Activity 中onCreate 内的代码

        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        String forum_title = extras.getString("TITLE");
        String forum_type = extras.getString("FORUM_TYPE");
        String forum_id = extras.getString("FORUM_ID");
    

    这是完整的活动。

    public class ForumInterface extends AppCompatActivity {
        private FirebaseFirestore db;
        private CollectionReference userRef;
        private ForumAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_forum_interface);
    
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            String forum_title = extras.getString("TITLE");
            String forum_type = extras.getString("FORUM_TYPE");
            String forum_id = extras.getString("FORUM_ID");
    
            db = FirebaseFirestore.getInstance();
            userRef = db.collection(forum_type).document(forum_id).collection(forum_title);
    
            TextView test = (TextView)findViewById(R.id.tvForumTitle);
            test.setText(forum_title);
        }
    }
    

    【讨论】:

    • 感谢您的回复,我确实更改了我的代码。我收到新错误原因:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on an null object reference at my.edu.fsktm .um.finalproject.ForumTitle.ForumInterface.onCreate(ForumInterface.java:27)
    • 因为您没有将bundle 设置为intent。在ReviewFragment 部分查看我的更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多