android - 选项卡执行 Android 中下一个 fragment 中存在的代码

标签 android android-fragments tabs fragmentpageradapter

我正在尝试使用 ViewPager 和 4 Fragments 通过滑动来实现 Tab。当我滑动选项卡时, fragment 网络各自的 xml 布局 在每个选项卡上正确显示,但 fragment 的代码未正确执行。 例如-以下选项卡中包含相应的 fragment 。

Tab0-ButtonFragment

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

Tab1-ImageFragment

public class ImageFragment extends Fragment {

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

    View rootView = inflater.inflate(R.layout.fragment_image, container, false);
    Log.i("inside", "image fragment");
    return rootView;
}

Tab2-TextFragment

    public class TextFragment extends Fragment {

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

    View rootView = inflater.inflate(R.layout.fragment_text, container, false);
    Log.i("inside", "text fragment");
    return rootView;
}

Tab3-测试 公共(public)类测试扩展 fragment {

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

    View rootView = inflater.inflate(R.layout.temp, container, false);
    Log.i("inside", "tessssssssst fragment");
    return rootView;
}

当显示选项卡时 我同时收到 tab0 和 tab1 的日志消息。然后在滑动并转到 tab1 后,我收到 tab2 的日志消息。滑动到选项卡 2 后,我收到选项卡 3 的日志消息,到达选项卡 3 时,不会显示任何日志消息。谁能告诉我如何执行各个选项卡的相应代码?我的剩余代码如下:

public class TabsPagerAdapter extends FragmentPagerAdapter { //Update - code formatting

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem( int index) {
    Log.i("index", "" + index);
    switch (index) {
    case 0:
        // Top Rated fragment activity
        return new ButtonFragment();
    case 1:
        // Games fragment activity
        return new ImageFragment();
    case 2:
        // Movies fragment activity
        return new TextFragment();
    case 3:
        return new Test();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 4;
}

主要 Activity

       public class MainActivity extends FragmentActivity implements OnTabChangeListener, OnPageChangeListener {

private TabsPagerAdapter mAdapter;
private ViewPager mViewPager;
private TabHost mTabHost;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);

    // Tab Initialization
    initialiseTabHost();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    // Fragments and ViewPager Initialization


    mViewPager.setAdapter(mAdapter);
    mViewPager.setOnPageChangeListener(MainActivity.this);
}

// Method to add a TabHost
private static void AddTab(MainActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec) {
    tabSpec.setContent(new MyTabFactory(activity));
    tabHost.addTab(tabSpec);
}

// Manages the Tab changes, synchronizing it with Pages
public void onTabChanged(String tag) {
    int pos = this.mTabHost.getCurrentTab();
    this.mViewPager.setCurrentItem(pos);
}

@Override
public void onPageScrollStateChanged(int arg0) {
}

// Manages the Page changes, synchronizing it with Tabs
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    int pos = this.mViewPager.getCurrentItem();
    this.mTabHost.setCurrentTab(pos);
}

@Override
    public void onPageSelected(int arg0) {

}


// Tabs Creation
private void initialiseTabHost() {
    mTabHost = (TabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup();

    // TODO Put here your Tabs
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("ButtonTab").setIndicator("ButtonTab"));
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("ImageTab").setIndicator("ImageTab"));
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("TextTab").setIndicator("TextTab"));
    MainActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("TestingTab").setIndicator("TestingTab"));

    mTabHost.setOnTabChangedListener(this);
}

最佳答案

这是 viewpager 的默认行为,您无法更改它,因为 viewpager 创建 fragment 以便 View 存在,以便用户可以在它们之间滑动,以便旧 View 滑出屏幕,新 View 滑到屏幕上。你可以像这样编写代码

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

这样当 fragment 可见时您的代码就会执行

关于android - 选项卡执行 Android 中下一个 fragment 中存在的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594132/

相关文章:

java - 随机游走者(圆圈)比其他轴更频繁地向上移动

java - 尝试映射 Json 时出现 JsonParseException

javascript - 如何从android webview JavascriptInterface调用admob插页式广告

java - 使用 FragmentTabHost 时出现 ClassCastException

java - Android在fragment中刷新listview

android - 选项卡 fragment - 选项卡随 fragment 侧面的按钮操作而变化

java - Android java、数据库类中的Dao接口(interface)似乎很奇怪

java - 如何在Android上与2个对话框 fragment 生命周期进行交互?

html - 从 Bootstrap .nav-tabs 中删除一些边框

javascript - 选项卡中的选项卡