如何使用 Swipe Tab 通过不同的 Fragment 通信/传递数据? [英] How can I communicate/pass data through different Fragments with Swipe Tab?

查看:18
本文介绍了如何使用 Swipe Tab 通过不同的 Fragment 通信/传递数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我有一个包含三个片段的滑动标签片段活动.我创建了自己的扩展 FragmentStatePageAdapter 的适配器.

现在我将解释每个选项卡(片段)的工作原理.

在标签 1 和标签 2 中,我有一个几乎相同类型的列表,当我指的是类型时,我的意思是它们是症状(发烧、眼睛疼痛等).

现在选项卡 3 用作托盘.每当我从选项卡 1 或选项卡 2 中的列表视图中选择一个项目时,我想将该项目传输到选项卡 3 并将该项目从选择它的列表中删除.

我尝试实现一个接口,但它对我不起作用,因为我通过适配器在 Main FragmentActivity 上添加了片段.我的问题是

<块引用>

  1. 如何沟通这三个片段?这意味着我如何在这些片段之间传递数据.

如果你想看看我现在做了什么,这里是:

我在我的问题中将此描述为 Tab 2

公共类 FragmentGeneralSymptoms 扩展 ListFragment 实现 OnItemClickListener {数组列表<字符串>症状列表;字符串名称;选择字符串;托盘托盘;@覆盖public View onCreateView(LayoutInflater inflater, ViewGroup 容器,捆绑保存的InstanceState){//TODO 自动生成的方法存根返回inflater.inflate(R.layout.fragment_generalsymptoms,容器,错误的);}@覆盖public void onActivityCreated(Bundle savedInstanceState) {//TODO 自动生成的方法存根super.onActivityCreated(savedInstanceState);捆绑参数 = getArguments();name = args.getString("key");托盘 = (托盘) getActivity();新的加载症状().执行();}类 LoadSymptoms 扩展 AsyncTask<String, String, String>{@覆盖受保护的字符串doInBackground(字符串...参数){//TODO 自动生成的方法存根KnowledgeBaseHelper 助手 = new KnowledgeBaseHelper(getActivity());ProfileHandler handler = new ProfileHandler(getActivity());配置文件 profile = handler.getProfile(name);字符串年龄 = profile.getAge() + "";字符串性别 = profile.getGender();症状列表 = helper.getSymptomList(姓名、年龄、性别);返回空值;}@覆盖受保护的无效onPostExecute(字符串结果){//TODO 自动生成的方法存根super.onPostExecute(结果);setListAdapter(new ArrayAdapter(getActivity(),R.layout.general_list,症状列表));}}@覆盖public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {//TODO 自动生成的方法存根选定 = 症状列表.get(arg2);托盘.响应(选择);}

}

我的标签 3

公共类 FragmentTray 扩展 ListFragment{私有数组列表<字符串>选定列表;公共 FragmentTray(){}@覆盖public View onCreateView(LayoutInflater inflater, ViewGroup 容器,捆绑保存的InstanceState){//TODO 自动生成的方法存根返回inflater.inflate(R.layout.fragment_tray,容器,假);}公共无效 addToTray(字符串症状){selectedList.add(症状);setListAdapter(new ArrayAdapter(getActivity(),R.layout.general_list, selectedList));}公共无效删除症状(字符串字符串){selectedList.remove(selectedList.indexOf(string));}}

我的 MainActivity 扩展了 FragmentActivity

public class MainActivity extends FragmentActivity implements TabListener, OnPageChangeListener, Tray {私有字符串 selectedProfileName;动作条动作条;视图页面视图页面;@覆盖受保护的无效 onCreate(捆绑 arg0){//TODO 自动生成的方法存根super.onCreate(arg0);setContentView(R.layout.main_activity);捆绑参数 = getIntent().getExtras();selectedProfileName = args.getString("key_name");viewPager = (ViewPager) findViewById(R.id.main_pager);viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));viewPager.setOnPageChangeListener(this);InitializeActionBar();}公共无效 InitializeActionBar() {actionBar = getActionBar();actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);ActionBar.Tab tabBodyPart = actionBar.newTab();tabBodyPart.setText("身体部位");tabBodyPart.setTabListener(MainActivity.this);ActionBar.Tab tabGeneralSymptoms = actionBar.newTab();tabGeneralSymtoms.setText("一般症状");tabGeneralSymptoms.setTabListener(MainActivity.this);ActionBar.Tab tabSelectedSymptoms = actionBar.newTab();tabSelectedSymptoms.setText("选定的症状");tabSelectedSymptoms.setTabListener(MainActivity.this);actionBar.addTab(tabBodyPart);actionBar.addTab(tabGeneralSymptoms);actionBar.addTab(tabSelectedSymptoms);}@覆盖public void onTabSelected(Tab tab, FragmentTransaction ft) {//TODO 自动生成的方法存根viewPager.setCurrentItem(tab.getPosition());}类 MyAdapter 扩展 FragmentStatePagerAdapter {公共 MyAdapter(FragmentManager fm) {超级(调频);//TODO 自动生成的构造函数存根}@覆盖公共片段getItem(int arg0){//TODO 自动生成的方法存根片段片段 = null;捆绑捆绑 = 新捆绑();bundle.putString("key", selectedProfileName);如果(arg0 == 0){片段 = 新的 FragmentBodyPart();片段.setArguments(捆绑);}如果(arg0 == 1){片段 = 新片段一般症状();片段.setArguments(捆绑);}如果(arg0 == 2){片段 = 新片段托盘();}返回片段;}@覆盖公共 int getCount() {//TODO 自动生成的方法存根返回 3;}}@覆盖公共无效 onPageSelected(int arg0) {//TODO 自动生成的方法存根actionBar.setSelectedNavigationItem(arg0);}@覆盖公共无效响应(字符串){//TODO 自动生成的方法存根FragmentTray frag2 = new FragmentTray();frag2.addToTray(string);}}

终于是我的界面

公共接口托盘{公共无效响应(字符串字符串);}

解决方案

我通常做的是:

1.- 定义接口.完成了,很好.

2.- 您的 FragmentGeneralSymptoms 必须有一个 已初始化 侦听器.你就是这样,但你忘了在课堂上设置监听器.

公共类 FragmentGeneralSymptoms 扩展 ListFragment 实现 OnItemClickListener {数组列表<字符串>症状列表;字符串名称;选择字符串;托盘托盘;(你的代码)public void setTrayListener(托盘监听器){托盘=听众;}@覆盖public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {//TODO 自动生成的方法存根选定 = 症状列表.get(arg2);如果(托盘!= null){症状列表.删除(选定);//如果你想从这个列表中删除这个元素托盘.响应(选择);}} }

3.- 您的 FragmentTray 类必须实现接口:

public class FragmentTray extends ListFragment implements Tray{私有数组列表<字符串>选定列表;公共 FragmentTray(){}@覆盖public View onCreateView(LayoutInflater inflater, ViewGroup 容器,捆绑保存的InstanceState){//TODO 自动生成的方法存根返回inflater.inflate(R.layout.fragment_tray,容器,假);}公共无效 addToTray(字符串症状){selectedList.add(症状);setListAdapter(new ArrayAdapter(getActivity(),R.layout.general_list, selectedList));}公共无效删除症状(字符串字符串){selectedList.remove(selectedList.indexOf(string));}公共无效响应(字符串名称){//做事!!!!selectedList.add(new Symtom(name));//例如System.out.println("FragmentTray 类中的response方法内部");}}

4.- 最后但并非最不重要.当你构建片段时,你必须注册监听器:

类 MyAdapter 扩展 FragmentStatePagerAdapter {私有列表<片段>片段列表;公共 MyAdapter(FragmentManager fm) {超级(调频);//TODO 自动生成的构造函数存根fragmentList = new ArrayList();片段 fragmentBodyPart = new FragmentBodyPart();片段fragmentTray = new FragmentTray();片段fragmentGeneralSymptoms = new FragmentGeneraSymptoms();//这个很重要*********************************fragmentGeneraSmptoms.setTrayListener(fragmentTray);fragmentList.add(fragmentBodyPart);fragmentList.add(fragmentGeneralSymptoms);fragmentList.add(fragmentTray);}@覆盖公共片段getItem(int arg0){//TODO 自动生成的方法存根片段片段 = null;捆绑捆绑 = 新捆绑();bundle.putString("key", selectedProfileName);如果(arg0 == 0){片段=(片段)片段列表.get(0);片段.setArguments(捆绑);}如果(arg0 == 1){片段 = (片段) 片段列表.get(1);片段.setArguments(捆绑);}如果(arg0 == 2){片段 = (片段) 片段列表.get(2);}返回片段;}@覆盖公共 int getCount() {//TODO 自动生成的方法存根返回片段列表.size();}}

希望对你有帮助.

Hi I have a Swipe Tab Fragment Activity that contains Three Fragments. I created my own adapter that extends FragmentStatePageAdapter.

Now here I'll explain how each tab (Fragments) works.

In Tab 1 and Tab 2, I have a list with practically the same type, when I mean type, I mean they are Symptoms (fever, pain in the eyes, etc.).

Now Tab 3 serves as a tray. Whenever I select an item from the listview in either Tab 1 or Tab 2, I want to transfer that item to Tab 3 and remove that Item from the List where it was selected.

I have tried implementing an Interface but it didn't work for me since I added the fragments on the Main FragmentActivity through an Adapter. MY questions is

  1. How can I communicate the three Fragments? Meaning how can I pass data between these fragment.

Now if you want to take a look at what I've done for now, here it is:

I depicted this as Tab 2 in my question

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

}

My Tab 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));
}

}

My MainActivity which Extends 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);
}
}

Finally my Interface

public interface Tray {

public void respond(String string);
}

解决方案

what I usually do is:

1.- Define the interface. It's done, fine.

2.- Your FragmentGeneralSymptoms must have an initializated listener. Yuou're that but you forgot to set the listener in the class.

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.- Your FragmentTray class must implement the interface:

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.- And last but not least. When you build the fragments you must register the listener:

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

}

I hope that it helps.

这篇关于如何使用 Swipe Tab 通过不同的 Fragment 通信/传递数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆