Взаимодействие между фрагментами в активности с вкладками - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь выполнить простое взаимодействие между двумя фрагментами в вкладке.

У меня есть два макета с TextView, EditText и Button. Я пытаюсь добиться перемещения текста из EditText в FragmentOne во EdidText (или TextView) во втором фрагменте при нажатии Button из FragmentOne. Но это не работает.

Во время отладки проблем нет. Приложение не перестает работать.

Что-то не так в ViewPager или SectionsPagerAdapter?

У меня есть два фрагмента. Фрагменты один:

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

} * * тысяча двадцать-один

И два фрагмента:

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

}

И это мое основное занятие:

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

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Я только что попробовал ваш код, и я сделал это обновление, чтобы оно заработало. Пожалуйста, отметьте это правильно, если это то, что вы ищете

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;
    }
}
0 голосов
/ 02 ноября 2018

Я предлагаю использовать getActivity () вместо

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