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

Android fragments 在多个片段和活动之间传递数据:从多个片段向活动发送不同的数据,android-fragments,Android Fragments,我有两个活动,主要活动,第二活动。主活动有一个按钮。当我按下按钮时,第二个活动开始。第二个活动有2个片段,片段A和片段B。片段A有一个按钮(B也是),我想通过单击按钮(关闭第二个活动)将一个字符串从片段A或B传递到主活动 我使用了一些引用来完成我的工作——当我单击片段A的按钮时,第二个活动关闭,一个字符串传递给主活动。它可以工作,但是当我点击片段B的按钮(执行与片段A相同的代码)时,我得到了一个错误 java.lang.ClassCastException:(packagename)。无法将第二

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

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

java.lang.ClassCastException:(packagename)。无法将第二个活动强制转换为(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,我需要对此代码执行什么操作?
请发布代码。

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

解决方案:

  • 将OnDataPass接口移动到SecondActivity
  • 从片段A和片段B中删除OnDataPass接口

  • 一切都应该很好。

    你说得对。请告诉我如何实现这两个接口,以及如何从这两个片段传递/接收不同的数据。我只是添加了第二个活动代码。@Masudur请检查我的更新答案:您需要将OnDataPass接口移动到第二个活动或独立文件并使用它。为什么要在onViewCreate
    dataPasser.OnDataPass(数据)中编写而不是
    passData(数据)