簡體   English   中英

如何在同一活動的兩個片段之間傳遞數據?

[英]How Do I Pass Data Between Two Fragments On The Same Activity?

在此處輸入圖像描述

你好,我正在做一個項目,但遇到了一些問題。 也就是說,我有兩個片段,每個片段都有自己的適配器,因為這兩個片段都是為了能夠水平滑動。 為了更清楚,應該附上我的布局的照片。 我希望能夠點擊底部片段,當我點擊頂部片段上的一個地方時,我點擊的圖像或“結構”將被放下。 但是,我想不通的是如何順利傳輸這些數據,如果我要通過活動來完成,我該怎么做,因為活動已經運行了它的所有代碼。 有人可以幫忙嗎,將不勝感激。

主要活動

public class MainMap extends AppCompatActivity
{
    MapData data = MapData.get();
    StructureData structure = StructureData.get();

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

        FragmentManager frag = getSupportFragmentManager();    //To manage the map fragment
        MapCellFragment rv = (MapCellFragment) frag.findFragmentById(R.id.map);

        FragmentManager selectionFrag = getSupportFragmentManager();    //To manage the selection fragment
        SelectionCellFragment cf = (SelectionCellFragment) selectionFrag.findFragmentById(R.id.bar);

        if (rv == null)
        {
            rv = new MapCellFragment(data);
            frag.beginTransaction().add(R.id.map, rv).commit();
        }

        if (cf == null)
        {
            cf = new SelectionCellFragment(structure);
            selectionFrag.beginTransaction().add(R.id.bar, cf).commit();
        }
        
    }

Map 片段

    public MapData data;

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

    public MapCellFragment(MapData data)
    {
        this.data = data;
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment gridCellFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static MapCellFragment newInstance(String param1, String param2) {
        MapCellFragment fragment = new MapCellFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.map_fragment, container, false);
        RecyclerView rv = (RecyclerView) view.findViewById(R.id.recyclerview);
        rv.setLayoutManager(new GridLayoutManager(getActivity(), MapData.HEIGHT, GridLayoutManager.HORIZONTAL,false));
        MapAdapter myAdapter = new MapAdapter(data);
        rv.setAdapter(myAdapter);
        return view;
    }

底部欄片段這本質上是另一個片段的復制和粘貼,只是更改輸入的數據和它所附加的 XML。

Map 適配器

package com.example.map;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MapAdapter extends RecyclerView.Adapter<MapViewHolder>
{
    MapData data;

    public MapAdapter(MapData data)
    {
        this.data = data;
    }

    @NonNull
    @Override
    public MapViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.grid_cells,parent,false);

        //Resizes the images within the grid cells xml file
        int size = parent.getMeasuredHeight() / MapData.HEIGHT + 1;
        ViewGroup.LayoutParams lp = view.getLayoutParams();
        lp.width = size;
        lp.height = size;

        MapViewHolder myViewHolder = new MapViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MapViewHolder holder, int position)
    {
        int row = position % MapData.HEIGHT;
        int col = position / MapData.HEIGHT;

        MapElement ele = data.get(row, col);

        holder.ne.setImageResource(ele.getNorthEast());
        holder.nw.setImageResource(ele.getNorthWest());
        holder.se.setImageResource(ele.getSouthEast());
        holder.sw.setImageResource(ele.getSouthWest());

        if(ele.getStructure() != null)
        {
            holder.mapStruct.setImageResource(ele.getStructure().getDrawableId());
        }

    }

    @Override
    public int getItemCount()
    {
        return 300;
    }

}

Map 視圖支架

package com.example.map;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.Objects;

public class MapViewHolder extends RecyclerView.ViewHolder {
    ImageView nw;
    ImageView ne;
    ImageView sw;
    ImageView se;
    ImageView mapStruct;

    public MapViewHolder(@NonNull View itemView)
    {
        super(itemView);
        nw = itemView.findViewById(R.id.northWest);
        ne = itemView.findViewById(R.id.northEast);
        sw = itemView.findViewById(R.id.southWest);
        se = itemView.findViewById(R.id.southEast);
        mapStruct = itemView.findViewById(R.id.structure);

    }

}

條形適配器

package com.example.map;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SelectionAdapter extends RecyclerView.Adapter<SelectionViewHolder>
{
    StructureData data;

    public SelectionAdapter(StructureData data)
    {
        this.data = data;
    }

    @NonNull
    @Override
    public SelectionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.list_selection,parent,false);
        SelectionViewHolder myViewHolder = new SelectionViewHolder(view);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull SelectionViewHolder holder, int position)
    {
        Structure s = data.get(position);
        holder.structure.setImageResource(s.getDrawableId());
        holder.label.setText(s.getLabel());
        holder.bind(s);
    }

    @Override
    public int getItemCount()
    {
        return data.size();
    }
}

條形視圖架

package com.example.map;

import android.annotation.SuppressLint;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.Objects;

public class SelectionViewHolder extends RecyclerView.ViewHolder
{
    Structure selectObject;
    ImageView structure;
    TextView label;

    public SelectionViewHolder(@NonNull View itemView)
    {
        super(itemView);
        structure = itemView.findViewById(R.id.image);
        label = itemView.findViewById(R.id.label);

        structure.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                SelectionCellFragment.selectedData = selectObject;
            }

        });

    }

    public void bind(Structure s)
    {
        selectObject = s;
    }

    //Maybe, I need to place this bind function in MapViewHolder as well
    //When I press on the button, I must share the information over to the Map fragment
    //Then the new information will form a ImageView on the big one
}

您可以使用ViewModel來解決您的用例。 當用戶點擊 select 結構時,您可能會在SelectionCellFragment中設置類似SelectedStructureViewModel的內容。 MapCellFragment可以觀察到這個SelectedStructureViewModel以在用戶選擇結構時得到通知。 然后,您可以在用戶點擊 Map 上的位置時查詢它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM