在多个片段和活动之间传递数据:从多个片段向活动发送不同的数据

时间:2014-11-17 06:12:24

标签: android-fragments

我有两个活动,MainActivity,SecondActivity。主要活动有一个按钮。当我按下按钮时,第二个活动开始。第二个活动有2个片段,FragmentA和FragmentB。片段A有一个按钮(B也),我想通过单击按钮(关闭第二个活动)将一个字符串从片段A或B传递到主要活动。

我使用了一些引用来完成我的工作 - 当我单击Fragment A的按钮时,第二个活动关闭,一个字符串传递给Main活动。它工作但是当我点击片段B的按钮(做与片段A相同的代码)时,我收到了一个错误,

java.lang.ClassCastException :( packagename).SecondActivity无法强制转换为(packagename).FragmentB $ OnDataPass

数据流:

  

片段A(按钮点击)>>主要活动(文本视图)(有效)

     

片段B(按钮点击)>>主要活动(文本视图)(不起作用)

这是我的片段代码:

String data ="String from fragment A";

public interface OnDataPass {
    public void onDataPass(String data);
}

OnDataPass dataPasser;

@Override
public void onAttach(Activity a) {
    super.onAttach(a);
    dataPasser = (OnDataPass) a;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    view = inflater.inflate(R.layout.fragment_a, container, false);
    btn = (Button) view.findViewById(R.id.btn1);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            dataPasser.onDataPass(data);
            getActivity().finish();
        }
    });


    return view;
}

public void passData(String data) {
    dataPasser.onDataPass(data);
}

这是我的片段B代码:

String data ="String from fragment B";

public interface OnDataPass {
    public void onDataPass(String data);
}

OnDataPass dataPasser;

@Override
public void onAttach(Activity a) {
    super.onAttach(a);
    dataPasser = (OnDataPass) a; // Exception occurs here

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    view = inflater.inflate(R.layout.fragment_b, container, false);
    btn = (Button) view.findViewById(R.id.btn1);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            dataPasser.onDataPass(data);
            getActivity().finish();
        }
    });


    return view;
}

public void passData(String data) {
    dataPasser.onDataPass(data);
}

我的第二个活动代码:

public class SecondActivity extends FragmentActivity implements OnDataPass {

    Button btn1,btn2;   
    TabHost tabHost;
    String dt="";
    ViewPager viewPager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_help);

        viewPager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmentManager)); 

    }

    @Override
    public void onDataPass(String data) {
        // TODO Auto-generated method stub
        Log.d("LOG::","hello " + data);
        dt= data;

        Intent intent = new Intent();
        intent.putExtra("key", dt);
        setResult(RESULT_OK, intent);
        finish();
        //startActivity(intent);
    }
}

class MyAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int i) {
        // TODO Auto-generated method stub
        Fragment fragment=null;

        if(i==0) {
            fragment = new FragmentA();
        }
        if(i==1) {
            fragment = new FragmentB();
        }

        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
        if(position == 0) {
            return "Tab 1";
        }
        if(position == 1) {
            return "Tab 2";
        }
        return null;
    }

}

我需要对此代码执行什么操作才能将FragmentB中的字符串转换为MainActivity? 请发布代码。

1 个答案:

答案 0 :(得分:2)

你已经在片段A和片段B中声明了OnDataPass接口,我怀疑你使用片段A的OnDataPass接口实现了SecondActivity,你试图在片段B中强制转换导致异常。

解决方案:

  1. 将OnDataPass界面移至SecondActivity
  2. 从片段A和片段B中删除OnDataPass接口。
  3. 一切都应该没问题。