【问题标题】:Communication between swipe view Tabs滑动视图选项卡之间的通信
【发布时间】:2017-03-31 14:51:41
【问题描述】:

我按照这篇文章http://www.truiton.com/2015/06/android-tabs-example-fragments-viewpager/ 来实现滑动视图,效果很好。所以现在我想在 Tab1 上添加按钮,单击时必须将数据发送到 Tab2。 我知道使用界面存在问题,但老实说,我不知道如何将其添加到这些代码中,并且工作对 android 来说是全新的。 到目前为止,我已经在这些链接上尽了最大努力Communication between SlidingTabLayout tabsHow to pass data from one swipe tab to another?How can I communicate/pass data through different Fragments with Swipe Tab?,但我失败了。 请任何人帮助使其在每个阶段都有效,我的意思是从 Tab1 ->Mainactivity->Tab2

非常感谢

这是我编辑问题后的代码

片段1

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

   public class TabFragment1 extends Fragment implements AdapterView.OnItemSelectedListener{
 Button send;
@Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     View v= inflater.inflate(R.layout.tab_fragment_1, container, false);
    send=(Button)v.findViewById(R.id.send);
         send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
   // value to be sent to the TabFragment2 on button click
           String value=" My Data";

                }
            });

  return v;
      }

    }

片段2

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

   public class TabFragment2 extends Fragment {

@Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.tab_fragment_2, container, false);
 //Display value from TabFragment1 
  textview.setText(value);
  }
}

接口类

public Interface FragmentCommunication
  {
  public void printMessage(String message);

  }

主活动

 import android.os.Bundle;
 import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends AppCompatActivity implements FragmentCommunication{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
     }
           public void printMessage(String message)
         {
     Toast.makeText(MainActivity.this,message,Toast.LENGTH_LONG).show();     
            }


     }

适配器类

 import android.support.v4.app.Fragment;    
 import android.support.v4.app.FragmentManager;   
 import android.support.v4.app.FragmentStatePagerAdapter;

public class PagerAdapter extends FragmentStatePagerAdapter {
   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;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return mNumOfTabs;
}
}

【问题讨论】:

  • 没有任何代码你可能只得到-1而不是回答...
  • 您可以使用 setArguments 函数将捆绑数据传递给片段
  • snachmsm 和 SaravInfern 感谢您的回复,我已对问题进行了更新
  • 你能根据上面的代码给我一个解释吗@SaravInfern
  • 我还添加了代码@snachmsm

标签: android android-layout android-fragments


【解决方案1】:

所以在发布更多代码后,我正在回答:

为您的Fragments 实现一些FragmentCommunication

//public class TabFragment1 extends Fragment implements FragmentCommunication{
public class TabFragment2 extends Fragment implements FragmentCommunication{

    //public static final String TAG="TabFragment1";
    public static final String TAG="TabFragment2";

    ...

    @Override
    public void onActivityCreated (Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        if(getActivity() instanceOf MainActivity)
            ((MainActivity) getActivity()).registerFragmentCommunication(
                TAG, this);
    }

    @Override
    public void printMessage(String message){
        Toast.makeText(getActivity(), TAG+" says: "+message,
            Toast.LENGTH_SHORT).show();
    }

}

注意onActivityCreated中的这一行:

((MainActivity) getActivity()).registerFragmentCommunication(TAG, this);

this 表示实现FragmentCommunicationTAG 将是Fragment 的唯一键/名称,整个方法是在Activity 中注册您的接口。所以现在您必须将 registerFragmentCommunication 方法添加到您的 MainActivity 并保持对传递的接口的引用,例如在HashMap:

HashMap<String, FragmentCommunication> fragmentCommunications =
    new HashMap<String, FragmentCommunication>();
...
public void registerFragmentCommunication(String key, FragmentCommunication fc){
    fragmentCommunications.put(key, fc);
}

所以现在您可以从您的MainActivity 访问两个片段的每个FragmentCommunication,例如通过使用这样的方法:

public void callFragmentCommunication(String key, String msg){
    if(fragmentCommunications.get(key)!=null)
        fragmentCommunications.get(key).printMessage();
}

callFragmentCommunication(TabFragment1.TAG, "hi!");
callFragmentCommunication(TabFragment2.TAG, "hi!");

方法是公开的,所以Fragments 可以这样简单地调用它:

//inside TabFragment1
if(isAdded() && getActivity()!=null && 
    getActivity() instanceOf MainActivity && 
        !getActivity().isFinishing())
    ((MainActivity) getActivity()).callFragmentCommunication(
        TabFragment2.TAG, "hi!");

这将显示 Toast 和文本:“TabFragment2 说:嗨!”,在 TabFragment1 内部调用。现在你也可以传递另一种数据了:)

还有更多的方法,例如通过FragmentStatePagerAdapterlike herepassing Bundle arguments 进行通信,其中片段被初始化,额外的反馈接口(例如,当消息传递时返回真/假)等。上面只是非常简化的方式,好祝你好运! :)

【讨论】:

  • 如果有用,请点赞和/或标记为回答我的帖子 :) 祝你好运!编辑:我已经用正确的地图初始化HashMap&lt;String, FragmentCommunication&gt;() 编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多