【问题标题】:Data passing between multiple fragment and activity: send different data to activity from multiple fragments多个Fragment和Activity之间的数据传递:从多个Fragment向Activity发送不同的数据
【发布时间】:2015-01-14 00:07:53
【问题描述】:

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

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

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

数据流:

Fragment A(按钮点击)>> Main Activity(文本视图)(作品)

Fragment B(按钮单击)>> Main Activity(文本视图)(不起作用)

这是我的片段 A 代码:

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? 请张贴代码。

【问题讨论】:

  • 你为什么写 onViewCreate dataPasser.onDataPass(data); 而不是passData(data);

标签: android-fragments


【解决方案1】:

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

解决方案:

  1. 将 OnDataPass 接口移至 SecondActivity
  2. 从 Fragment A 和 Fragment B 中移除 OnDataPass 接口。

一切都会好起来的。

【讨论】:

  • 你是对的。请告诉我如何实现这两个接口以及如何从两个片段传递/接收不同的数据。我只是添加我的第二个活动代码。
  • @Masudur 请检查我的更新答案:您需要将 OnDataPass 接口移动到 SecondActivity 或独立文件并使用它。
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多