【问题标题】:cannot find fragment from viewpager无法从 viewpager 中找到片段
【发布时间】:2017-10-11 07:11:45
【问题描述】:

我的活动中有一个片段,其中有一个 viewpager,其中有 5 个片段,在主要活动中我需要从 viewpager 中获取一个片段

活动

public class MainActivity extends AppCompatActivity {


    public void setFragment(){

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
    mainFragment= new MainFragment();
    FragmentTransaction fragmentTransaction =getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.container, mainFragment,"mainFragment");

    fragmentTransaction.commitAllowingStateLoss();

        }
    }, 250);
  }

    public void findFragment() {

    mainFragment= (MainFragment) getSupportFragmentManager().findFragmentByTag("mainFragment");

    viewPager = mainFragment.viewPager;
    FragmentOne fragment = (FragmentOne) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + viewPager.getCurrentItem());


  }

}

主片段

public class MainFragment extends Fragment{


private void initViewPagerAndTabs() {

    viewPager =  view.findViewById(R.id.viewPager);
    pagerAdapter = new PagerAdapter(getChildFragmentManager());

    pagerAdapter.addFragment(FragmentOne.newInstance(), "one");
    pagerAdapter.addFragment(FragmentTwo.newInstance(), "two");
    pagerAdapter.addFragment(FragmentThree.newInstance(), "three");
    pagerAdapter.addFragment(FragmentFour.newInstance(), "four");
    pagerAdapter.addFragment(FragmentFive.newInstance(), "five");

    viewPager.setAdapter(pagerAdapter);
    TabLayout tabLayout = view.findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(viewPager);
    viewPager.setCurrentItem(1);
    viewPager.setOffscreenPageLimit(3);
  }

    private static class PagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> fragmentList = new ArrayList<>();
    private final List<String> fragmentTitleList = new ArrayList<>();

    private PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment, String title) {
        fragmentList.add(fragment);
        fragmentTitleList.add(title);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitleList.get(position);
    }

  }


}

如果我使用“getFragmentManager()”而不是“getChildFragmentManager()”,那么它会返回片段,但是当我在 viewPager 中使用“getChildFragmentManager()”时,它会在活动中返回 null

【问题讨论】:

  • 所以上面的代码有效吗?而FragmentOne fragment = (FragmentOne) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + viewPager.getCurrentItem()); 正在重新截断片段?
  • 是的,它工作正常,但现在我决定添加更多功能,同时我想将 getFragmentManager 更改为 getChildFragmentManager,现在它返回 null

标签: android android-fragments android-viewpager


【解决方案1】:

试试这个运行代码的 1 个片段,它可能对你的代码有所帮助:

主要活动

public class OpenQuran extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

TabLayout tabLayoutqaue;
Pager mAdapter;
MediaPlayer mp;

//This is our viewPagerss
ViewPager viewPager;
View mWebView;

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

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("Read Quran");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //Initializing the tablayout
    tabLayoutqaue = (TabLayout) findViewById(R.id.tabLayoutqaue);

    //Initializing viewPager
    viewPager = (ViewPager) findViewById(R.id.pager);

    //Creating our pager adapter
    mAdapter = new Pager(getSupportFragmentManager());

    // 1 Fragment
    mAdapter .addFrag(new Quran(), "Quran");


    viewPager.setAdapter(mAdapter);

    tabLayoutqaue.setupWithViewPager(viewPager);


    tabLayoutqaue.setOnTabSelectedListener(this);

}

@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 class parahlist extends Fragment {

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

    //Returning the layout file after inflating
    //Change R.layout.tab1 in you classes
    return inflater.inflate(R.layout.activity_parahlist, container, false);}


public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

}

}

查看寻呼机类:

public class Pager extends FragmentPagerAdapter {

//integer to count number of tabs
int tabCount;
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

//Constructor to the class
public Pager(FragmentManager fm) {
    super(fm);
    //Initializing tab count
    this.tabCount= tabCount;
}

//Overriding method getItem
@Override
public Fragment getItem(int position) {

    return mFragmentList.get(position);

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

public void addFrag(Fragment Fragment, String title) {
    mFragmentList.add(Fragment);
    mFragmentTitleList.add(title);
}



@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

}

现在这是 MainActivity、第二个片段和第三个片段的代码是 View Pager 类。您不需要更改或编辑您的 View Pager Class。只需创建 Java 类并按原样粘贴该代码。 在主要活动中,行:mAdapter .addFrag(new Quran(), "Quran"); 添加描述和片段。您可以在“新建”之后添加自己的片段。 之后,您必须将 Tablayout 小部件放入您的 Xml 中,如下所示:

  <android.support.design.widget.TabLayout
        android:id="@+id/tabLayoutqaue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorgreen"
        android:minHeight="?attr/actionBarSize"
        app:tabIndicatorColor="@color/colorback"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

和查看寻呼机一样:

  <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    />

您可能会遇到一些关于 tablayout 的问题: 只需将此行放在您的 gradle 构建中的依赖项下:

 compile 'com.android.support:design:25.3.1' 

根据您的版本。例如你有25.0.1 然后行将是:

compile 'com.android.support:design:25.0.1

我仍然在这里告诉你更多。如果你有问题!

【讨论】:

  • 感谢您的帮助,但我想知道我的问题的解决方案,而不是更改一大堆代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多