1

enter image description hereКак отправить данные из одного фрагмента в другой фрагмент в android?

Hello Я делаю простой вкладку, используя пейджер и фрагмент. Таким образом, у меня есть две вкладки в моем представлении. В одной вкладке у меня есть представление списка, в котором каждая строка имеет текстовое изображение и кнопку избранного изображения. Во вторых вкладках мне нужно показать все имя элемента, которое является фаворитом на первой вкладке .so Мне нужно отправить список из одного фрагмента в другой список.

вот мой код

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; 
    } 
} 

Как показано на изображении выше, я выбираю первую станцию ​​- это моя любимая станция. Мне нужно отобразить на второй вкладке? может ли это возможно?

+0

Вам нужно добавить FragmentpagerAdapter на свой пост –

+0

нормально я отправлю это .. !! – user944513

+0

Одним из решений может быть создание глобальной статической varibale и функции, где вы можете сохранить свои данные adn в другом фрагменте, вы можете использовать эту статическую varibale, используя статический метод первого фрагмента. – RajSharma

ответ

1

Существует несколько способов сделать это.

Самый базовый и рекомендуемый - это определение интерфейса в отправляющем фрагменте, а затем действие контейнера Activity реализует этот интерфейс, чтобы вы могли отправлять данные из вашего фрагмента в Activity. Из этого вы можете отправить данные в получающий фрагмент.
Взгляните на этом официальном руководстве от Google:
http://developer.android.com/training/basics/fragments/communicating.html

Другой способ использует стиль событий автобус, это гораздо круче, чем предыдущий. Вы можете сделать это с помощью Otto.Подпишитесь в своем получаемом фрагменте, а затем просто отправьте любые данные из вашего отправляемого фрагмента, не нужно связываться или писать длинные интерфейсы.

2

Предположим, что вы отправляете данные от FragmentA до FragmentB, то лучшей практикой является использование интерфейсов, а затем связь между фрагментом через активность контейнера. Ниже приведен небольшой фрагмент код, который обеспечит со скелетом, что я пытаюсь сказать:

Шаг-1: В вашем Fragmenta определить интерфейс и переопределить onAttach() метод, чтобы сделать его обязательным для контейнерной деятельности в реализовать интерфейс и предоставить тело его методу.

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"); 
    } 
} 

Теперь в вашем Fragmenta вы можете передать значение MyMethod() как: if (listener!=null) { listener.myMethod(yourArguments); }

Шаг 2: Теперь в вашей контейнерной деятельности реализовать обратного вызова интерфейса

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. 
     } 
} 

Шаг 3: В FragmentB есть способ сказать, например, methodInFragmentB (yourParameters)

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

Надеюсь, что вышеприведенное описание поможет. Благодарю.

+0

Спасибо за ответ. Я скоро вас обновлю. – user944513

Смежные вопросы