Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
816 views
in Technique[技术] by (71.8m points)

how to send data from one fragment to another fragment in android?

enter image description here

Hello I make a simple tab view using pager and fragment . So I have two tabs in my view .In one tab I have list view in which each row have textview and favourite image button .In second Tabs I need to show all item name which is favourite in first tab .so I need to send a list from one fragment to another another list .

here is my code

Mainactivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
    ViewPager viewPager;
    FragmentpagerAdapter fragmentpagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ActionBar actionBar =getActionBar();
        viewPager = (ViewPager) findViewById(R.id.pager);
        fragmentpagerAdapter =new FragmentpagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(fragmentpagerAdapter);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.addTab(actionBar.newTab().setText("Stations").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("fav Station").setTabListener(this));

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
            actionBar.setSelectedNavigationItem(i);
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

    }


    @Override
    public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

        viewPager.setCurrentItem(tab.getPosition());

    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

    }
}

activity_main.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/pager"
   >


</android.support.v4.view.ViewPager>

fragmentone.java

public class Fragmentone  extends Fragment{

    ArrayList<DataModel> name;
    boolean isPressed=false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_one, container, false);
        name=new ArrayList<DataModel>();
        name.add(new DataModel("First Station",false));
        name.add(new DataModel("Second Station",false));





        ListView listView = (ListView) view.findViewById(R.id.list_view);

        CustomAdapter customAdapter =new CustomAdapter(getActivity(),name);
        listView.setAdapter(customAdapter);



        return view;
    }


}

customAdapter.java

public class CustomAdapter extends BaseAdapter implements View.OnClickListener {

    private Activity activity;
    private ArrayList data;
    private static LayoutInflater inflater = null;
    boolean isPressed=false;


    public CustomAdapter(Activity a, ArrayList d) {

        /********** Take passed values **********/
        activity = a;
        data = d;
        inflater = (LayoutInflater) activity.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    }


    @Override
    public int getCount() {
        if (data.size() <= 0)
            return 1;
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public void onClick(View v) {



    }

    /*********
     * Create a holder Class to contain inflated xml file elements
     *********/
    public static class ViewHolder {

        public TextView text;

        public ImageButton imageButton;

    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        View vi = convertView;
        final ViewHolder holder;

        if (convertView == null) {

            /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
            vi = inflater.inflate(R.layout.row_layout, null);

            /****** View Holder Object to contain tabitem.xml file elements ******/

            holder = new ViewHolder();
            holder.text = (TextView) vi.findViewById(R.id.station_name);

            holder.imageButton = (ImageButton) vi.findViewById(R.id.favorite);
            holder.imageButton.setBackgroundResource(R.drawable.off);

            /************  Set holder with LayoutInflater ************/
            vi.setTag(holder);
        } else
            holder = (ViewHolder) vi.getTag();

        if (data.size() <= 0) {
            holder.text.setText("No Data");

        } else {

            DataModel dataModel = (DataModel) data.get(position);

            /************  Set Model values in Holder elements ***********/

            holder.text.setText(dataModel.getText());

            // this is for overall row click
            vi.setOnClickListener(new View.OnClickListener() {



                @Override
                public void onClick(View v) {
                    Log.d("row is click","row click"+position);
                }
            });
            // this is for image button onclick
            holder.imageButton.setOnClickListener(new View.OnClickListener() {
                DataModel dataModel = (DataModel) data.get(position);
                @Override
                public void onClick(View v) {
                    if(dataModel.isselected()){
                        holder.imageButton.setBackgroundResource(R.drawable.off);
                        dataModel.setIsselected(false);
                    }else{
                        holder.imageButton.setBackgroundResource(R.drawable.on);
                        dataModel.setIsselected(true);
                    }
                    isPressed = !isPressed; // reverse

                }
            });
            ;


        }
        return vi;
    }
}

datamodel.java

public class DataModel {

    String text;

    DataModel(String text, boolean isselected) {
        this.text = text;
        this.isselected = isselected;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public boolean isselected() {
        return isselected;
    }

    public void setIsselected(boolean isselected) {
        this.isselected = isselected;
    }

    boolean isselected;
}

fragmentone.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#325633"
   >

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_view">
    </ListView>

</LinearLayout>

rowlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/station_name"
        android:padding="10dp"
        android:textColor="#eee345"
        android:textAppearance="?android:textAppearanceLarge"
        />

    <ImageButton android:id="@+id/favorite"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"

        android:background="#00ffffff"
     />


</LinearLayout>

fragmenttwo.java

public class FragmentTwo extends Fragment {

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

fragmenttwo.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ee2333">

</LinearLayout>

enter image description here

public class FragmentpagerAdapter extends FragmentPagerAdapter {


    public FragmentpagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {

        switch (i) {

            case 0:
                return new Fragmentone();
            case 1:
                return new FragmentTwo();
            default:
                break;



        }
        return  null;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

As shown in image above I select first station is my favourite station .I need to display on second tab ? can it is possible ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Suppose you are sending data from FragmentA to FragmentB, then the best practice is to use Interfaces and then communicate between fragment via the container activity. Below is a small snippet that will provide with the skeleton of what i am trying to say:

Step-1: In your FragmentA define an Interface and override onAttach() method to make it mandatory for your container activity to implement the interface and provide body to its method.

    public interface MyInterfaceListener{
      public void myMethod(yourParameters)//this method will hold parameters which you can then use in your container activity to send it to FragmentB 
}

private MyInterfaceListener listener;
@Override
public void onAttach(Activity activity) {
  super.onAttach(activity);
  if (activity instanceof MyInterfaceListener) {
    listener = (MyInterfaceListener) activity;// This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception 
  } else {
    throw new ClassCastException(activity.toString()
        + " must implemenet MyListFragment.OnItemSelectedListener");
  }
}

Now, in your FragmentA you can pass value to myMethod() like: if (listener!=null) { listener.myMethod(yourArguments); }

Step-2: Now, In your container activity implement the callback Interface

public class MyActivity extends Activity implements MyInterfaceListener{
        @Override
         public void myMethod(yourParameters) {
              //do your stuff here. do whatever you want to do with the //parameter list which is nothing but data from FragmentA.
                FragmentB fragment = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.yourFragmentB);
                fragment.methodInFragmentB(sendDataAsArguments);// calling a method in FragmentB and and sending data as arguments. 
        }
}

Step-3: In FragmentB have a method say for example methodInFragmentB(yourParameters)

    public void methodInFragmentB(yourParameters){
      //do whatever you want to do with the data..... 
}

I hope the above description helps. Thanks.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...