【问题标题】:Tab Fragment Button Click send data to more than one tabFragmentTab Fragment 按钮 点击发送数据到多个 tabFragment
【发布时间】:2017-05-31 12:00:37
【问题描述】:

我有三个选项卡片段 TAB1、TAB2 和 TAB3。在 TAB1 上有一个按钮,当单击它时,它必须使用接口将数据发送到 TAB2 和 TAB3,并在相应片段的 textView 中显示数据。到目前为止,我已经设法从 TAB1 发送到 TAB2,如下所示

 //  interface  codes
  public interface IFragmentToActivity {
  void Tab1ToTab2(String value);
 }

 //  in activity 

    @Override
  public void Tab1ToTab2(String value) {
TabFragment2 fragment = (TabFragment2) adapter.getFragment(1);
if (fragment != null) {
    fragment.fragmentCommunicationFragment(value);
} else {
    // Log.i(LOG_TAG, "Fragment 2 is not initialized");
}
   }


  ///   in TAB1 i send data

          @Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button2:
            mCallback.FragmentToFragment("hi from tab 1");
            break;
             }
                   }

我怎样才能使它适用于所有片段?这是我想发送到 TAB2 和 3 时尝试过的。

接口代码

public interface IFragmentToActivity {
void Tab1ToTab2(String value);
void Tab1ToTab3(String value);
     }

TAB1 发送数据

    @Override
      public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button2:
            mCallback.Tab1ToTab2("hi from tab 1");
            mCallback.Tab1ToTab3(hi from tab 1");
            break;
    }

Main Activity 中接收的代码

       @Override
        public void Tab1ToTab2(String value) {
    TabFragment2 fragment = (TabFragment2) adapter.getFragment(1);
    if (fragment != null) {
        fragment.fragmentCommunicationFragment(value);
    } else {
        // Log.i(LOG_TAG, "Fragment 2 is not initialized");
    }
}

@Override
public void Tab1ToTab3(String value) {
    TabFragment3 fragment = (TabFragment3) adapter.getFragment(1);
    if (fragment != null) {
        fragment.FromFragmentOne(value);
    }

    else {
        // Log.i(LOG_TAG, "Fragment 3 is not initialized");
    }
}

/// TAB 2方法接收数据

  public void fragmentCommunicationFragment(String value){
      mTextView1.setText(value);
      }

/// TAB 3方法接收数据

   public void FromFragmentOne(String kabila){
    mTextView1.setText(kabila);
}

// 适配器

 public class PagerAdapter extends FragmentStatePagerAdapter {
private final SparseArray<WeakReference<Fragment>> instantiatedFragments = new SparseArray<>();
private ArrayList<String> mTabHeader;
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            TabFragment1 tab1 = new TabFragment1();
            return tab1;
        case 1:
            TabFragment2 tab2 = new TabFragment2();
            return tab2;
        case 2:
            TabFragment3 tab3 = new TabFragment3();
            return tab3;
        case 3:
            TabFragment4 tab4 = new TabFragment4();
            return tab4;
        default:
            return null;
    }
}

【问题讨论】:

  • 我认为你应该在片段中使用 setArgument() 和 getArgument() 让它变得简单。
  • 谢谢@AniruddhParihar 我能提供一个关于这个概念的示例代码吗?
  • 我已经发布了一个代码。验证它。

标签: android android-fragments android-viewpager


【解决方案1】:

在您的 Tab1ToTab3 方法中,您正在使用第二个片段实例化 TabFragment3:

TabFragment3 fragment = (TabFragment3) adapter.getFragment(1);

替换为

TabFragment3 fragment = (TabFragment3) adapter.getFragment(2);

【讨论】:

  • 感谢@Alexandre BOURETZ 的回复,但 Tab3 中仍然没有显示数据,尽管在 tab2 中显示
【解决方案2】:

// 用这个更新你的 getItem() 方法

  @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                Bundle bundle =  new Bundle();
                bundle.putString("YOUR_KEY","YOUR VALUE");
                TabFragment1 tab1 = new TabFragment1();
                tab1.setArguments(bundle);
                return tab1;
            case 1:
                Bundle bundle2 =  new Bundle();
                bundle2.putString("YOUR_KEY","YOUR VALUE");
                TabFragment2 tab2 = new TabFragment2();
                tab2.setArguments(bundle2);
                return tab2;
            case 2:
                Bundle bundle3 =  new Bundle();
                bundle3.putString("YOUR_KEY","YOUR VALUE");
                TabFragment3 tab3 = new TabFragment3();
                tab3.setArguments(bundle3);
                return tab3;
            case 3:
                Bundle bundle4 =  new Bundle();
                bundle4.putString("YOUR_KEY","YOUR VALUE");
                TabFragment4 tab4 = new TabFragment4();
                tab4.setArguments(bundle4);
                return tab4;
            default:
                return null;
        }

// TabFragment1、TabFragment2、TabFragment3、TabFragment4下 覆盖 onActivityCreated() 以获取您的数据 String 和 setMenuVisibility(boolean menuVisible) 以更新视图

     public static String data;


     @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            Bundle bundle = getArguments();
            String yourValue = bundle.getString("YOUR_KEY");
imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   TabFragment1.data="Update";
                   TabFragment2.data="Update";
                   TabFragment3.data="Update";
                   TabFragment4.data="Update";
    //update your current View from here
                }
            });
        }



     @Override
        public void setMenuVisibility(boolean menuVisible) {
            super.setMenuVisibility(menuVisible);
            if(menuVisible){
                //update your current View from here
            }
        }

通过使用它,您可以从任何片段更新所有片段数据视图。点击

【讨论】:

  • 感谢@Aniruddh Parihar,它可以很好地显示每个片段的预定义数据,但我的问题是如何从一个选项卡片段中单击按钮并向所有片段显示值。
  • 或者我该如何修改它,以便它可以从 tab1 获取价值并使用这样的概念显示到所有片段,谢谢@Aniruddh Parihar
  • 您可以通过在每个片段中使用静态变量和 setMenuVisibility() 方法来实现。如果您有四个片段,则您拥有包含数据的集合或类的四个静态变量,每个片段一个并覆盖每个片段中的 setMenuVisibility(boolean menuVisible) 方法,现在在 TabFragment1 的 OnClick() 中,您必须更新您的所有四个静态变量都包含要在所有片段中显示的数据并更新 TabFragment1 的数据。现在当你进入 TabFragment2 然后 setMenuVisibility(boolean menuVisible) 将被调用,在这里你可以更新
  • 很抱歉,如果它不打扰您,请帮我提供示例代码,以便我可以了解您所表达的内容.. 对您的概念印象深刻.. 谢谢
  • Pariharhelpme 请帮忙写代码,这是我的第一个项目,所以我有点难以理解你只用文字表达的意思
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多