mmr
mmr

Reputation: 133

Data passing between multiple fragment and activity: send different data to activity from multiple fragments

I have two activities, MainActivity, SecondActivity. Main Activity has a button. When I press the button Second Activity starts. Second Activity has 2 fragments, FragmentA and FragmentB. Fragment A has a button (B also), and I want to pass a string from Fragment A or B to Main Activity by clicking the button (Closing second activity).

I have used some references to do my job - When I click the button of Fragment A, second activity closes and a string passed to Main activity. It works But When I click the button of Fragment B (doing the same code as for Fragment A), I got an error,

java.lang.ClassCastException: (packagename).SecondActivity cannot be cast to (packagename).FragmentB$OnDataPass

dataflow:

Fragment A (button click) >> Main Activity (text view) (works)

Fragment B (button click) >> Main Activity (text view) (does not work)

Here is my Fragment A code:

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

Here is my Fragment B code:

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

My second Activity code:

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

What would I need to do to this code to get the string in FragmentB to MainActivity? Please post code.

Upvotes: 0

Views: 1190

Answers (1)

Eldhose M Babu
Eldhose M Babu

Reputation: 14520

You have declared the OnDataPass interface in both Fragment A and Fragment B and I suspect you implemented SecondActivity with OnDataPass interface of Fragment A which You have tried to cast in Fragment B resulted in the exception.

Solution :

  1. Move OnDataPass interface to SecondActivity
  2. Remove OnDataPass interface from Fragment A and Fragment B.

Everything should be fine.

Upvotes: 2

Related Questions