【问题标题】:How can I add a fragment to a ViewPager? addView crashes my app如何将片段添加到 ViewPager? addView 使我的应用程序崩溃
【发布时间】:2013-04-26 17:30:56
【问题描述】:

我正在使用默认的 Swipe Tab Fragment 代码,当您启动新的 Android 应用程序时,Android 会使用该代码启动。我已经想出了如何修改我的数据和使用选项卡,但我还没有想出如何将一个简单的片段添加到已经存在的内容中。我想在选项卡的顶部或正下方添加一个信息栏。我敢肯定这很简单,我只是不知道如何大声笑。我通过例子来学习。

我尝试向 viewpager 添加视图,但我的应用程序崩溃了,我认为我完全做错了。

在我的 MainActivity 中: ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    SubBarFragment infobar = new SubBarFragment();
    mViewPager.addView(infobar.getView());      
.....[extra code for menus and things]

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
....[code to show specific tabs and return the tab's fragment]

infobarfragment.java

public class InfobarFragment extends Fragment {

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.infobar, container, false);
        return view;
      }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

信息栏.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_wifi" />

    <TextView
        android:id="@+id/statusText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Wifi Status Information" />

</LinearLayout>

【问题讨论】:

  • 你有一个 ViewPager 的适配器,使用 getItem / instanciateItem 方法(取决于你使用的是什么:片段或简单视图)。这些方法为 viewpager 对象提供了所有需要的视图。
  • 您可以在适配器中返回多个片段吗?我已经想出了如何使用 Santhosh 的帮助添加片段,但它只是将其视为另一个我可以浏览的“页面”。无论我在哪个页面上,我都希望它是持久的。我曾希望它位于标签上方,但我认为这是不可能的。所以现在我想把它放在标签下面是好的。想法?

标签: android layout android-fragments android-viewpager


【解决方案1】:

你可以按照这个方法:

只需为分页器中的每个视图使用片段。

FragmentActivityonCreate()方法中编写以下代码。

List<Fragment> fragments = new Vector<Fragment>();

//for each fragment you want to add to the pager
Bundle page = new Bundle();
page.putString("url", url);
fragments.add(Fragment.instantiate(this,MyFragment.class.getName(),page));

//after adding all the fragments write the below lines

this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(), fragments);

mPager.setAdapter(this.mPagerAdapter);

示例片段定义:

public class MyFragment extends Fragment {


public static MyFragment newInstance(String imageUrl) {

final MyFragment mf = new MyFragment ();

    final Bundle args = new Bundle();
    args.putString("somedata", "somedata");
    mf.setArguments(args);

    return mf;
}

public MyFragment() {}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String data = getArguments().getString("somedata");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate and locate the main ImageView
    final View v = inflater.inflate(R.layout.my_fragment_view, container, false);
    //... 
    return v;
}

FragmentPagerAdapter

public class MyFragmentAdapter extends FragmentPagerAdapter {

public static int pos = 0;

private List<Fragment> myFragments;

public MyFragmentAdapter(FragmentManager fm, List<Fragment> myFrags) {
    super(fm);
    myFragments = myFrags;
}

@Override
public Fragment getItem(int position) {

    return myFragments.get(position);

}

@Override
public int getCount() {

    return myFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {

    setPos(position);

    String PageTitle = "";

    switch(pos)
    {
        case 0:
                PageTitle = "page 1";
                break;
        case 1:
                PageTitle = "page 2";
                break;
        case 2:
                PageTitle = "page 3";
                break;
        case 3:
                PageTitle = "page 4";
                break;
        case 4:
                PageTitle = "page 5";
                break;
        case 5: 
                PageTitle = "page 6";
                break;
        case 6:
                PageTitle = "page 7";
                break;
    }
    return PageTitle;
}

public static int getPos() {
    return pos;
}

 public static void setPos(int pos) {
    MyFragmentAdapter.pos = pos;
 }
}

【讨论】:

  • 嗨桑托什。这有助于我了解如何更轻松地将片段添加到我当前的适配器!我可以添加一个片段,但它只是将我添加的片段视为我可以浏览的另一个页面。如果我滑动到不同的选项卡,无论我滑动到哪个页面,我都希望我添加的“状态栏”片段保持在顶部或底部。本质上,状态栏就像一个子操作栏。只是让我的用户知道正在发生的事情的状态。我需要重新制定策略吗?
  • 片段被添加到视图寻呼机。我认为您可以为片段活动创建一个布局(linearlayout[vertical]),在顶部具有 fragment_container,然后在其下方具有 viewpager。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2018-08-26
相关资源
最近更新 更多