java - 选项卡式 Activity 中 fragment 之间的交互

标签 java android android-layout android-fragments android-viewpager

我正在尝试在选项卡式 Activity 中的两个 fragment 之间进行简单的交互。

我有两个布局 TextView , EditTextButton 。我正在尝试从EditText移动文本在 FragmentOne 中设置为 EdidText (或 TextView )在 fragment 二中,当 Button 时从 FragmentOne 被按下。但这不起作用。

调试过程中没有任何问题。应用程序不会停止工作。

ViewPager 有问题吗?或SectionsPagerAdapter

我有这两个 fragment 。 fragment 一:

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

}

fragment 二:

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

}

这是我的主要 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;
    }
}
}

最佳答案

我刚刚尝试了你的代码,这是我为使其工作而所做的更新。如果这是您要查找的内容,请标记为正确

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

关于java - 选项卡式 Activity 中 fragment 之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53120671/

相关文章:

java - 如何在一行代码中配置 JacksonJaxbJsonProvider?

java - 访问 setOnTouchListener 中的循环变量

java - 如何修复 IllegalMonitorStateException

java - 用 Short 和 int 重载

android - 我们可以访问我的安卓手机的麦克风驱动程序吗

android - TaskStackBuilder - 是否向后兼容?

Android 样式 : Difference between 'style="@android:style/XYZ "' and ' style ="?android:attr/XYZ"'?

android - 如何强制对话的横向模式?

android - ViewAnimator 使用旋转动画在 View 之间转换

java - wildfly hibernate log4j 日志记录不工作