Lukáš Tatarin
Lukáš Tatarin

Reputation: 3

Interaction between fragments in Tabbed activity

I am trying a simple interaction between two fragments in Tabbed activity.

I have a two layouts with TextView, EditText and Button. I am trying to achieve move text from EditText in FragmentOne to the EdidText (or TextView) in Fragment two when the Button from FragmentOne is pressed. But it doesnt works.

During debuging there isnt any problem. App doesnt stop working.

Is something problem in ViewPager or SectionsPagerAdapter?

I have this two fragments. Fragments One:

public class FragmentOne extends Fragment {

TextView textView;
EditText editText;
Button button;

private OnFragmentOneInteractionListener mListener;

public FragmentOne()
{
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_one, container, false);
    editText = (EditText) view.findViewById(R.id.fragOne_txb);
    textView = (TextView) view.findViewById(R.id.fragTwo_header);
    button = (Button) view.findViewById(R.id.fragOne_btn_to2);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            String text = editText.getText().toString();
            mListener.onFragmentOneInteraction(text);
        }
    });
    return view;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentOneInteractionListener) {
        mListener = (OnFragmentOneInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentOneInteractionListener");
    }
}

@Override
public void onDetach() 
{
    super.onDetach();
    mListener = null;
}

public interface OnFragmentOneInteractionListener
{
    void onFragmentOneInteraction(String string);
}

}

And fragments two:

public class FragmentTwo extends Fragment{

private OnFragmentTwoInteractionListener mListener;

public EditText editText;

public FragmentTwo()
{
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_two, container, false);
    editText = (EditText) view.findViewById(R.id.fragTwo_txb);
    return view;
}

public void onUpdateEditText(String string)
{
    this.editText.setText(string);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentTwoInteractionListener) {
        mListener = (OnFragmentTwoInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentTwoInteractionListener");
    }
}

@Override
public void onDetach()
{
    super.onDetach();
    mListener = null;
}

public interface OnFragmentTwoInteractionListener
{
    void onFragmentTwoInteraction(Uri uri);
}

}

And this is my main activity:

public class MainActivity extends AppCompatActivity 
                      implements FragmentOne.OnFragmentOneInteractionListener,
                                 FragmentTwo.OnFragmentTwoInteractionListener
{
private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

    mViewPager.addOnPageChangeListener(
                   new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(
                   new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
}

@Override
public void onFragmentOneInteraction(String string)
{
    FragmentTwo fr2 = (FragmentTwo) getSupportFragmentManager().findFragmentById(R.id.fr2);
    fr2.onUpdateEditText(string);
}

@Override
public void onFragmentTwoInteraction(Uri uri) 
{

}

public class SectionsPagerAdapter extends FragmentPagerAdapter
{

    public SectionsPagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        switch (position)
        {
            case 0:
                FragmentOne fragmentOne = new FragmentOne();
                return fragmentOne;

            case 1:
                FragmentTwo fragmentTwo = new FragmentTwo();
                return fragmentTwo;

            default:
                return null;
        }
    }

    @Override
    public int getCount()
    {
        // Show 2 total pages.
        return 2;
    }
}
}

Upvotes: 0

Views: 81

Answers (2)

Arjun
Arjun

Reputation: 358

I just tried your code and this is the update i did to make it work. Please mark it correct if its what you are looking for

private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

    mViewPager.addOnPageChangeListener(
            new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(
            new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
}

@Override
public void onFragmentOneInteraction(String string)
{
    fragmentTwo.onUpdateEditText(string);

    /*FragmentTwo fr2 = (FragmentTwo) getSupportFragmentManager().findFragmentById(R.id.fr2);
    fr2.onUpdateEditText(string);*/
}

@Override
public void onFragmentTwoInteraction(Uri uri)
{
}

FragmentTwo fragmentTwo = new FragmentTwo();

public class SectionsPagerAdapter extends FragmentPagerAdapter
{

    public SectionsPagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        switch (position)
        {
            case 0:
                FragmentOne fragmentOne = new FragmentOne();
                return fragmentOne;

            case 1:

                return fragmentTwo;

            default:
                return null;
        }
    }

    @Override
    public int getCount()
    {
        // Show 2 total pages.
        return 2;
    }
}

Upvotes: 1

Pierre GAGNON
Pierre GAGNON

Reputation: 26

I suggest to use getActivity() instead

if (getActivity() instanceof OnFragmentOneInteractionListener) {
    mListener = (OnFragmentOneInteractionListener) getActivity();
} else {
    throw new RuntimeException(context.toString()
            + " must implement OnFragmentOneInteractionListener");
}

Upvotes: 0

Related Questions