Android fragments 在多个片段和活动之间传递数据:从多个片段向活动发送不同的数据
我有两个活动,主要活动,第二活动。主活动有一个按钮。当我按下按钮时,第二个活动开始。第二个活动有2个片段,片段A和片段B。片段A有一个按钮(B也是),我想通过单击按钮(关闭第二个活动)将一个字符串从片段A或B传递到主活动 我使用了一些引用来完成我的工作——当我单击片段A的按钮时,第二个活动关闭,一个字符串传递给主活动。它可以工作,但是当我点击片段B的按钮(执行与片段A相同的代码)时,我得到了一个错误 java.lang.ClassCastException:(packagename)。无法将第二个活动强制转换为(packagename)。FragmentB$OnDataPass 数据流: 片段A(点击按钮)>>主要活动(文本视图)(作品) 片段B(按钮点击)>>主要活动(文本视图)(不工作) 这是我的代码片段:Android fragments 在多个片段和活动之间传递数据:从多个片段向活动发送不同的数据,android-fragments,Android Fragments,我有两个活动,主要活动,第二活动。主活动有一个按钮。当我按下按钮时,第二个活动开始。第二个活动有2个片段,片段A和片段B。片段A有一个按钮(B也是),我想通过单击按钮(关闭第二个活动)将一个字符串从片段A或B传递到主活动 我使用了一些引用来完成我的工作——当我单击片段A的按钮时,第二个活动关闭,一个字符串传递给主活动。它可以工作,但是当我点击片段B的按钮(执行与片段A相同的代码)时,我得到了一个错误 java.lang.ClassCastException:(packagename)。无法将第二
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,我需要对此代码执行什么操作?
请发布代码。您已经在片段A和片段B中声明了OnDataPass接口,我怀疑您使用片段A的OnDataPass接口实现了SecondActivity,您尝试在片段B中强制转换该接口导致了异常 解决方案:
一切都应该很好。你说得对。请告诉我如何实现这两个接口,以及如何从这两个片段传递/接收不同的数据。我只是添加了第二个活动代码。@Masudur请检查我的更新答案:您需要将OnDataPass接口移动到第二个活动或独立文件并使用它。为什么要在onViewCreate
dataPasser.OnDataPass(数据)中编写代码>而不是passData(数据)代码>