之前我使用过这段代码来获得具有两个布局的滑动标签视图,它可以正常工作。
public class MainActivity extends FragmentActivity {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_OBJECT, position);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// Show 2 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
}
return null;
}
}
/**
* A dummy fragment representing a section of the app, but that simply
* displays dummy text.
*/
public static class DummySectionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";
public static final String ARG_OBJECT = "object";
public DummySectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle args = getArguments();
int position = args.getInt(ARG_OBJECT);
int tabLayout = 0;
switch (position) {
case 0:
tabLayout = R.layout.tab_new;
break;
case 1:
tabLayout = R.layout.tab_summary;
break;
}
View rootView = inflater.inflate(tabLayout, container, false);
return rootView;
}
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Intent i = new Intent(this, SettingsActivity.class);
startActivity(i);
}
return true;
}
}
为此,我只创建了2个xml文件,并在标签正确定位时初始化它们;但是,现在我想要2个选项卡,但第二个必须是列表。我不知道该怎么做。我尝试扩展listFragment,但它崩溃了找不到的资源。我已经被困了很长时间了,有人请帮忙吗?我搜索了很多并查看了所有示例,但没有一个显示如何在选项卡中创建列表以及如何调用它。
这就是我现在所拥有的 MainActivity
public class MainActivity extends FragmentActivity {
SimpleListFragment x = new SimpleListFragment();
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_OBJECT, position + 1);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// Show 3 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
}
return null;
}
}
/**
* A dummy fragment representing a section of the app, but that simply
* displays dummy text.
*/
public static class DummySectionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";
public static final String ARG_OBJECT = "object";
public DummySectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle args = getArguments();
int position = args.getInt(ARG_OBJECT);
int tabLayout = 0;
switch (position) {
case 0:
tabLayout = R.layout.tab_home;
break;
case 1:
SimpleListFragment simpleListFragment = new SimpleListFragment();
break;
}
View rootView = inflater.inflate(tabLayout, container, false);
return rootView;
}
}
}
答案 0 :(得分:6)
ATM您正在DummySectionFragment中创建ListFragment。那不对。
这是一种做法。不是最好的,而是一个很好理解的。
在主活动中创建片段并将它们传递给适配器。 DummyListFragment是从ListFragment派生的新类。这里重要的是它使用的XML布局包含一个具有id @android:id / list的ListView。 (因此片段能够理解它必须/可以使用哪个列表视图。
public class MainActivity extends FragmentActivity {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
List<Fragment> mFragments;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragments = new ArrayList<Fragment>();
mFragments.add(new DummySectionFragment();
mFragments.add(new DummyListFragment();
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager(), mFragments);
...
public class SectionsPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragmentList;
public SectionsPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
fragmentList = fragments;
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = fragmentList.get(position);
return fragment;
}
。
public static class DummyListFragment extends ListFragment {
public DummyListFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.my_list_fragment, container, false);
}
答案 1 :(得分:0)
好的,我们来看看。
完全删除DummySectionFragment
类
创建两个单独的片段。一个适合您的ListView
&amp;另一个。确保让它们正常工作。 Eclipse生成的代码使用support library中的Fragment类,因此您的Fragments必须从Fragment
和扩展ListFragment
(或android.support.v4.app
)类。不是来自android.app
。确保导入正确的。
更改FragmentPagerAdapter
的实施:
public class MyPagerAdapter extends FragmentPagerAdapter
{
public MyPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int pos)
{
// return instances of your custom fragments
// tab 0: list
// tab 1: other
// (for more than 2 tabs use a switch statement instead)
return (position == 0) ? new MyListFragment() : new MyOtherFragment();
}
@Override
public int getCount()
{
// Defines the number of tabs shown and positions that getItem() should handel
return 2;
}
@Override
public CharSequence getPageTitle(int position)
{
// define the titles for your tabs in the strings.xml resource
switch (position)
{
case 0: return getString(R.string.tab_fragment_title);
case 1: return getString(R.string.other_fragment_title);
}
return null;
}
}
使用新适配器:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create your adapter and pass the support fragment manager
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with your pager adapter
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(adapter);
}