2015-03-01 2 views
0

Этот tutorial относится к общению между фрагментами, но не делает его для вкладок. Я хочу отправить данные между моим фрагментом «Дневной уход», который является вкладкой моего фрагмента «You», который также является вкладкой. Я застрял на этой неделе. Я действительно не знаю, как объединить концепцию интерфейсов с андроидами с вкладками и данными из asynctasks.Как передавать данные между фрагментами при использовании вкладок и onTabSelected()?

Я создал интерфейс в своем фрагменте Daycare. Я хочу отправить строку «daycarename» в фрагмент «you» с помощью метода «passparam». Из того, что я понял, ему нужно как-то пройти через MainActivity, который реализует мой интерфейс TabClickedListener. Как передать его с MainActivity обратно на другой фрагмент?

public class MainActivity extends Activity implements ActionBar.TabListener, DaycareFragment.TabClickedListener { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 

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

     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager(), this); 

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
       actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 

     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 

       return new YouFragment(); 
      case 1: 

       return new DaycareFragment(); 
      case 2: 

       return new ThirdFragment(); 

     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section3).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section2).toUpperCase(l); 

     } 
     return null; 
    } 
} 

    public class MainFragment extends Fragment { 

     private static final String ARG_SECTION_TYPE = "section type"; 

     public MainFragment(){} 

     public MainFragment(int sectionNumber) { 
      Bundle args = new Bundle(); 
      args.putInt(ARG_SECTION_TYPE, sectionNumber); 
      setArguments(args); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

      //setup the view 
      switch(getArguments().getInt(ARG_SECTION_TYPE)) { 
       //hide or show fields based on page number. 
      } 

      return rootView; 
     } 
    } 
    @Override 
    public void passParam(String var) { 
     Toast.makeText(this, "Clicked " + var, Toast.LENGTH_LONG).show(); 

    } 
} 

Я реализую интерфейс в моем ListFragment:

public class DaycareFragment extends ListFragment { 

    TabClickedListener listener; 

    public interface TabClickedListener { 
     public void passParam(String var); 
    } 
String email; 
    UserFunctions userFunctions; 
    Boolean owner; 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_daycare, container, false); 
     movies = new ArrayList<HashMap<String, String>>(); 

     userFunctions = new UserFunctions(); 
     HashMap map = new HashMap(); 
     map = userFunctions.getdauser(getActivity()); 
     email = (String) map.get("email"); 

     new GetDaDaycares().execute(); 

     return rootView; 
    } 
class GetDaDaycares extends AsyncTask<String, String, String>{ 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 


     @Override 
     protected String doInBackground(String... args) { 

      String city = "london"; 
      try { 

       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       params.add(new BasicNameValuePair("city", city)); 

       @SuppressWarnings("unused") 
       JSONObject json = parser.makeHttpRequest(getdaycare, params); 
       jArray = json.getJSONArray("lTable"); 

       for (int i =0; i<jArray.length();i++){ 

        JSONObject c = jArray.getJSONObject(i); 
        String daycarename = c.getString("daycarename"); 

        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("daycarename", daycarename); 
        movies.add(map); 

       } 

      } catch(JSONException e) { 

       e.printStackTrace(); 
      } 
      return null; 

     } 

     protected void onPostExecute(String zoom){ 
      pDialog.dismiss(); 

      getActivity().runOnUiThread(new Runnable() { 
       public void run() { 


        ListAdapter adapter = new SimpleAdapter(getActivity(), movies, 
          R.layout.list, new String[] {"daycarename"}, 
          new int[]{R.id.textView1}); 

        setListAdapter(adapter); 
        ListView lv = getListView(); 
        lv.setOnItemClickListener(new OnItemClickListener(){ 

         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, 
               long id) { 

          String daycarename =movies.get(position).get("daycarename"); 

         } 

        }); 


       } 
      }); 
     } 

    } 

} 
+0

Нужно ли мне два интерфейса? – JeromeWasBannedBySONazis

+1

http://stackoverflow.com/questions/14804560/fragmenttabhost-fragments-how-do-i-pass-data-between-tabs Попробуйте это –

ответ

1

Если бы это была моя проблема (что это было) я бы центральный объект, который отвечает за данные «Sharing» между фрагменты.

Реализация, как правило, сопровождается 1 из 2 путей: одна, создайте синглтон, который любой объект может получить экземпляр, или два, действие инициализирует один экземпляр объекта и передает его каждому фрагменту при их инициализации ,

Фрагменты (или AsyncTask) затем будут обновлять и извлекать данные из этого центрального объекта с помощью шаблона наблюдателя или на дисплее, как бы вы ни хотели.

p.s. Если вы собираетесь использовать AsyncTask во фрагменте, вам нужно будет реализовать стратегию для обеспечения того, чтобы ваш пользовательский интерфейс не был мертв, когда он заканчивается. В противном случае вы можете выбросить исключение.

p.p.s onPostExecute работает по потоку пользовательского интерфейса по умолчанию.

1

В вашем Activity:

public void passStrToYou(String daycarename) 
{ 
    FragmentManager fm = getFragmentManager();    
    Fragment youFrag = (YouFragment)fm.FragmentManager fm.findFragmentById(R.id.youFragment); 

    //call mathod 'setDayCareName' in 'you' fragment 
    youFrag.setDayCareName(daycarename); 
} 

Надеется, что это поможет!

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