2014-02-28 51 views
3

嗨,我有一個Swipe Tab片段活動,其中包含三個片段。我創建了自己的適配器來擴展FragmentStatePageAdapter。如何使用Swipe Tab通過不同的片段傳遞/傳遞數據?

現在,我將解釋每個標籤(Fragments)的工作原理。

在表1和表2中,我列出了幾乎相同的類型,當我指的是類型時,我的意思是它們是症狀(發燒,眼睛疼痛等)。

現在標籤3用作托盤。每當我在Tab 1或Tab 2的列表視圖中選擇一個項目時,我想將該項目轉移到Tab 3,並從列表中選擇該項目。

我已經嘗試過實現一個接口,但它並沒有爲我工作,因爲我通過一個適配器在主要FragmentActivity上添加了片段。我的問題是

  1. 我該如何溝通這三個碎片?這意味着如何在這些片段之間傳遞數據。

現在,如果你想看看有什麼我現在做了,那就是:

我在我的問題

public class FragmentGeneralSymptoms extends ListFragment implements OnItemClickListener { 
ArrayList<String> symptomList; 
String name; 
String selected; 
Tray tray; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_generalsymptoms, container, 
      false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    Bundle args = getArguments(); 
    name = args.getString("key"); 
    tray = (Tray) getActivity(); 

    new LoadSymptoms().execute(); 
} 

class LoadSymptoms extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     KnowledgeBaseHelper helper = new KnowledgeBaseHelper(getActivity()); 
     ProfileHandler handler = new ProfileHandler(getActivity()); 

     Profiles profile = handler.getProfile(name); 
     String age = profile.getAge() + ""; 
     String gender = profile.getGender(); 

     symptomList = helper.getSymptomList(name, age, gender); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       R.layout.general_list, symptomList)); 
    } 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    // TODO Auto-generated method stub 
    selected = symptomList.get(arg2); 
    tray.respond(selected); 
} 

}描述這個作爲標籤2

我的標籤3

public class FragmentTray extends ListFragment{ 
private ArrayList<String> selectedList; 

public FragmentTray(){} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_tray, container, false); 
} 

public void addToTray(String symptom){ 
    selectedList.add(symptom); 
    setListAdapter(new ArrayAdapter<String>(getActivity(), 
      R.layout.general_list, selectedList)); 
} 

public void removeSymptom(String string){ 
    selectedList.remove(selectedList.indexOf(string)); 
} 

} 

我的MainActivity延伸FragmentActivity

public class MainActivity extends FragmentActivity implements TabListener, OnPageChangeListener, Tray { 
private String selectedProfileName; 
ActionBar actionBar; 
ViewPager viewPager; 

@Override 
protected void onCreate(Bundle arg0) { 
    // TODO Auto-generated method stub 
    super.onCreate(arg0); 
    setContentView(R.layout.main_activity); 

    Bundle args = getIntent().getExtras(); 
    selectedProfileName = args.getString("key_name"); 

    viewPager = (ViewPager) findViewById(R.id.main_pager); 
    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager())); 
    viewPager.setOnPageChangeListener(this); 

    InitializeActionBar(); 

} 

public void InitializeActionBar() { 
    actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tabBodyPart = actionBar.newTab(); 
    tabBodyPart.setText("Body Parts"); 
    tabBodyPart.setTabListener(MainActivity.this); 

    ActionBar.Tab tabGeneralSymptoms = actionBar.newTab(); 
    tabGeneralSymptoms.setText("General Symptoms"); 
    tabGeneralSymptoms.setTabListener(MainActivity.this); 

    ActionBar.Tab tabSelectedSymptoms = actionBar.newTab(); 
    tabSelectedSymptoms.setText("Selected Symptoms"); 
    tabSelectedSymptoms.setTabListener(MainActivity.this); 

    actionBar.addTab(tabBodyPart); 
    actionBar.addTab(tabGeneralSymptoms); 
    actionBar.addTab(tabSelectedSymptoms); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    viewPager.setCurrentItem(tab.getPosition()); 
} 

class MyAdapter extends FragmentStatePagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     // TODO Auto-generated method stub 
     Fragment fragment = null; 
     Bundle bundle = new Bundle(); 
     bundle.putString("key", selectedProfileName); 
     if (arg0 == 0) { 
      fragment = new FragmentBodyPart(); 
      fragment.setArguments(bundle); 
     } 
     if (arg0 == 1) { 
      fragment = new FragmentGeneralSymptoms(); 
      fragment.setArguments(bundle); 
     } 
     if (arg0 == 2) { 
      fragment = new FragmentTray(); 
     } 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 3; 
    } 

} 

@Override 
public void onPageSelected(int arg0) { 
    // TODO Auto-generated method stub 
    actionBar.setSelectedNavigationItem(arg0); 
} 

@Override 
public void respond(String string) { 
    // TODO Auto-generated method stub 
    FragmentTray frag2 = new FragmentTray(); 
    frag2.addToTray(string); 
} 
} 

最後我接口

public interface Tray { 

public void respond(String string); 
} 
+0

你應該看看這個http://stackoverflow.com/questions/20490827/attach-layouts-to-tabs-android – Rick

+0

hi @ user2675569,我已經連接了Tabs和View Pager,一切正常。我想知道的是如何在這些片段之間傳遞數據。謝謝 – sander126

+0

您是否嘗試過使用活動來「傳送」該數據? – sandrstar

回答

1

我通常做的是:

1.-定義的接口。完成了,很好。

2:你FragmentGeneralSymptoms必須有一個initializated聽衆。不過你忘了在課堂上設置聽衆。

public class FragmentGeneralSymptoms extends ListFragment implements OnItemClickListener { 
    ArrayList<String> symptomList; 
    String name; 
    String selected; 
    Tray tray; 

    (your code) 

    public void setTrayListener(Tray listener) 
    { 
     tray = listener; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 
     selected = symptomList.get(arg2); 
     if(tray != null) 
     { 
      symptomList.remove(selected); // if you want to remove this element from this list 
      tray.respond(selected); 
     } 
    } } 

3.-你FragmentTray類必須實現的接口:

public class FragmentTray extends ListFragment implements Tray{ 
private ArrayList<String> selectedList; 

public FragmentTray(){} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_tray, container, false); 
} 

public void addToTray(String symptom){ 
    selectedList.add(symptom); 
    setListAdapter(new ArrayAdapter<String>(getActivity(), 
      R.layout.general_list, selectedList)); 
} 

public void removeSymptom(String string){ 
    selectedList.remove(selectedList.indexOf(string)); 
} 

public void respond(String name) 
{ 

// do stuffs!!!! 
selectedList.add(new Symtom(name)); // for example 
System.out.println("Inside the respond method respond in FragmentTray class"); 

} 
} 

4.-最後但並非最不重要的。當你建立片段,你必須註冊聽衆:

class MyAdapter extends FragmentStatePagerAdapter { 

    private List<Fragment> fragmentList; 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
     fragmentList = new ArrayList<Fragment>(); 

     Fragment fragmentBodyPart = new FragmentBodyPart(); 
     Fragment fragmentTray = new FragmentTray(); 
     Fragment fragmentGeneralSymptoms = new FragmentGeneraSymptoms(); 

     // this is important********************************* 
     fragmentGeneraSmptoms.setTrayListener(fragmentTray); 

     fragmentList.add(fragmentBodyPart); 
     fragmentList.add(fragmentGeneralSymptoms); 
     fragmentList.add(fragmentTray); 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     // TODO Auto-generated method stub 
     Fragment fragment = null; 
     Bundle bundle = new Bundle(); 
     bundle.putString("key", selectedProfileName); 
     if (arg0 == 0) { 
      fragment = (Fragment) fragmentList.get(0); 
      fragment.setArguments(bundle); 
     } 
     if (arg0 == 1) { 
      fragment = (Fragment) fragmentList.get(1); 
      fragment.setArguments(bundle); 
     } 
     if (arg0 == 2) { 
      fragment = (Fragment) fragmentList.get(2); 
     } 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return fragmentList.size(); 
    } 

} 

我希望它有幫助。