带有ViewPager和setCurrentItem的FragmentPagerAdapter - 奇怪的行为或已知错误?

时间:2014-11-24 10:03:12

标签: android android-layout android-fragments android-viewpager

我有一个非常简单的ViewPager和FragmentPagerAdapter设置的奇怪行为。

首先,这里是源代码。我在一个适配器中有3个片段。并且对应Activity中的所有按钮都有一个回调函数。

这是Fragment0

public class Fragment0 extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment0, container, false);
    }
}

和Fragment0的xml布局

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

    <Button     android:id=                 "@+id/pager_button_prev0"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "1"
                android:tag=                "page0"
                android:onClick=            "pagerTestClick"/>

    <Button     android:id=                 "@+id/pager_button_next0"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "2"
                android:tag=                "page0"
                android:onClick=            "pagerTestClick"/>
</LinearLayout>

片段1:

public class Fragment1 extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment1, container, false);
    }
}

带有相应的布局

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

    <Button     android:id=                 "@+id/pager_button_prev1"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "2"
                android:tag=                "page1"
                android:onClick=            "pagerTestClick"/>

    <Button     android:id=                 "@+id/pager_button_next1"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "0"
                android:tag=                "page1"
                android:onClick=            "pagerTestClick"/>
</LinearLayout>

Fragment2:

public class Fragment2 extends Fragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment2, container, false);
    }
}

还有简单的布局:

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

    <Button     android:id=                 "@+id/pager_button_prev2"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "0"
                android:tag=                "page2"
                android:onClick=            "pagerTestClick"/>

    <Button     android:id=                 "@+id/pager_button_next2"
                android:layout_width=       "wrap_content"
                android:layout_height=      "wrap_content"
                android:text=               "1"
                android:tag=                "page2"
                android:onClick=            "pagerTestClick"/>
</LinearLayout>

好的,非常简单吧?这是FragmentPagerAdapter

public class Fragment_Pager_Adapter extends android.support.v4.app.FragmentPagerAdapter
{
List<Fragment> fragments = new ArrayList<Fragment>();

/**
 * default constructor
 */
public Fragment_Pager_Adapter(FragmentManager fm)
{
    super(fm);
    Fragment0 fragment0 =  new Fragment0();
    this.fragments.add(fragment0);
    Fragment1 fragment1 =  new Fragment1();
    this.fragments.add(fragment1);
    Fragment2 fragment2 =  new Fragment2();
    this.fragments.add(fragment2);
}

@Override
public Fragment getItem(int position)
{
    if (position >= this.getCount())
    {
        throw new AssertionError();
    }
    return this.fragments.get(position);
}

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

}

这里也没有伏都教。慢慢地,我们正在解决这个问题。正如您在XML布局文件中看到的那样,我为每个按钮调用“pagerTestClick”。这是功能:

public void pagerTestClick(View view)
{
    int page = Integer.parseInt(((Button) view).getText().toString());
    String tag = view.getTag().toString();
    this.viewPager.setCurrentItem(page);
}

现在问题

当我点击3页时。首先点击一切似乎很好。但在某个时刻,某些东西搞砸了。即使我在page1上并单击按钮“0”到达page0,似乎为page2上的按钮调用了“pagerTestClick”函数,因为“tag”字符串是“page2”。

我做错了吗?或者这是一个已知的错误?

其他问题

如果我通过滑动浏览页面,everthings在所有页面上都能正常工作(例如,如果我在每个页面上添加一些额外的按钮)但是当我使用“setCurrentItem”并手动选择页面时,似乎可点击区域不是页面的完整大小。这意味着,如果我在页面上添加一些额外的UI按钮,其中只有一些是可点击的。 如果我滑动转换到page0然后滑动到pageX,那么一切正常。

**整个问题可能与“setCurrentItem”有关吗?在调用“setCurrentItem”后,我是否需要调用任何特殊内容?

更奇怪的行为

我发现了一个更奇怪的行为。当我通过“setCurrentItem”点击页面时,在某些时候我似乎可以单击“浏览”当前页面并单击之前显示的页面上的按钮。这意味着,当我在第2页,并点击带有“setCurrentItem”的page1时,似乎我仍然可以点击page2的元素(对于这种情况,我在每个页面上添加了一些广泛分布的虚拟按钮)

0 个答案:

没有答案