Tabs execute the codes present in their next fragments in android

两盒软妹~` 提交于 2019-12-04 16:07:06

This is default behaviour of viewpager you can not change it as viewpager creates fragments so that the views exist, so the user can swipe between them, so that the old view sliding off the screen and the new view sliding onto the screen. You can write your code like this

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
          Log.i("inside", "button fragment");
        }else{
           // fragment is not visible
        }
    } 

so that when fragment is visible your code execute

When change your tab recall your corresponding fragment. Try this it will help you

Create TabFragment.java

public class TabFragment extends Fragment implements OnPageChangeListener,
    OnTabChangeListener {
private TabHost tabHost;
private int currentTab = 0;
private SwipeDisableViewPager viewPager;
protected TabPagerAdapter pageAdapter;
private List<Fragment> fragments;
private final int TAB_BUTTON=0,TAB_IMAGE=1,TAB_TEXT=2,TAB_TEST=3;

@SuppressWarnings("unchecked")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_tabhost, null);
    viewPager = (SwipeDisableViewPager) view.findViewById(R.id.viewpager);
    tabHost = (TabHost) view.findViewById(android.R.id.tabhost);
    viewPager.addOnPageChangeListener(this);
    fragments = new ArrayList<>();
    fragments.add(new ButtonFragment());
    fragments.add(new ImageFragment());
    fragments.add(new TextFragment());
    fragments.add(new Test());
    return view;
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    pageAdapter = new TabPagerAdapter(getChildFragmentManager(), fragments, getArguments());
    pageAdapter.notifyDataSetChanged();
    viewPager.setAdapter(pageAdapter);
    viewPager.setOffscreenPageLimit(3);
    setupTabs();
}


private void setupTabs() {
    tabHost.setup();
    tabHost.addTab(newTab(R.string.home, R.drawable.menu_home_bg));
    tabHost.addTab(newTab(R.string.likes, R.drawable.menu_likes_bg));
    tabHost.addTab(newTab(R.string.matches, R.drawable.menu_matches_bg));
    for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {
        tabHost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);

    }
    tabHost.setOnTabChangedListener(this);
    tabHost.setCurrentTab(currentTab);
}

private View getTabIndicator(Context context, int title, int icon) {
    View view = LayoutInflater.from(context).inflate(R.layout.tab_view, null);
    ImageView iv = (ImageView) view.findViewById(R.id.imageView);
    iv.setImageResource(icon);
    TextView tv = (TextView) view.findViewById(R.id.textView);
    tv.setText(title);
    return view;
}

private TabSpec newTab(int tabValue, int icon) {
    TabSpec tabSpec = tabHost.newTabSpec(getString(tabValue));
    tabSpec.setIndicator(getTabIndicator(tabHost.getContext(), tabValue, icon));
    tabSpec.setContent(new Dummy(getActivity()));
    return tabSpec;
}

@Override
public void onPageScrollStateChanged(int arg0) {

}

@Override
public void onPageScrolled(int currentPosition, float arg1, int arg2) {

}

@Override
public void onPageSelected(int position) {
    if (position == 0)
        viewPager.setSwipeEnabled(false);
    else
        viewPager.setSwipeEnabled(true);
    tabHost.setCurrentTab(position);
    if (listener != null)
        listener.onTabChanged(position);
}

@Override
public void onTabChanged(String tabId) {
    currentTab = tabHost.getCurrentTab();
    viewPager.setCurrentItem(currentTab);
    switch(currentTab){
      case TAB_BUTTON:
        ((ButtonFragment) fragments.get(currentTab)).recall();
      break;
      case TAB_IMAGE:
        ((ImageFragment) fragments.get(currentTab)).recall();
      break;
      case TAB_TEXT:
        ((TextFragment) fragments.get(currentTab)).recall();
      break;
      case TAB_TEST:
        ((Test) fragments.get(currentTab)).recall();
      break;        
}
}

create tab_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/menu_bg"
        android:fadingEdge="none"
        android:gravity="center"
        android:showDividers="none"
        android:tabStripEnabled="false" />

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0" />

    <com.mobellotech.shift.Widget.SwipeDisableViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="#FFFFFF" />
</LinearLayout>
</TabHost>

Create tab_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="45dp"
android:layout_height="45dp"
    android:contentDescription="@string/menu_icon" />

<TextView
    android:id="@+id/textView"
     android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

Create TabPagerAdaper

public class TabPagerAdapter extends FragmentPagerAdapter {
private Bundle args;
private List<Fragment> fragments;

public TabPagerAdapter(FragmentManager fm, List<Fragment> fragments,
                       Bundle args) {
    super(fm);
    this.fragments = fragments;
    this.args = args;
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = fragments.get(position);
    fragment.setArguments(args);
    return fragment;
}

@Override
public int getCount() {
    return fragments.size();
}

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}
}

Create MainActivity.java

public class MainActivity extends AppCompatActivity  {

protected TabFragment tabFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tabFragment = new TabFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frame_container, tabFragment).commit();
}
}

Create activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/DrawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
      />
</android.support.v4.widget.DrawerLayout>

Finally add the recall method in your fragment class like this

public class ButtonFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.fragment_button, container, false);
Log.i("inside", "button fragment");
return rootView;
}
 public void recall() {
     Log.i("inside", "button fragment");
 }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!