3

背景

我正在编写一个使用 ViewPager 的应用程序,并且运行良好。我需要能够定位其中一种布局(xml 文件)并更新其上的 textviews 和 imageviews。我尝试使用“v.findViewById”来扩大视图和定位,这似乎是我研究的解决方案,但也许我把它放在正确的位置,需要更好地向我解释。

我的代码(不尝试定位)

private ImageView circle;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    circle = (ImageView) findViewById(R.id.circles);

    MyPagerAdapter adapter = new MyPagerAdapter();
    ViewPager myPager = (ViewPager) findViewById(R.id.myViewPager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(1);
    myPager.setOnPageChangeListener(new MyPageChangeListener()); 
}

private int focusedPage = 0;
private class MyPageChangeListener extends ViewPager.SimpleOnPageChangeListener {
    @Override
    public void onPageSelected(int position) {
        focusedPage = position;

        switch (focusedPage) {
            case 0: circle.setImageResource(R.drawable.circles1); break;
            case 1: circle.setImageResource(R.drawable.circles2); break;
            case 2: circle.setImageResource(R.drawable.circles3); break;
            case 3: circle.setImageResource(R.drawable.circles4); break;
        }
    }
}

private class MyPagerAdapter extends PagerAdapter {

    public int getCount() {
        return 4;
    }

    public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int resId = 0;
        switch (position) {
            case 0:
                resId = R.layout.zip;
                break;
            case 1:
                resId = R.layout.forecast;
                break;
            case 2:
                resId = R.layout.settings;
                break;
            case 3:
                resId = R.layout.about;
                break;
        }

        View view = inflater.inflate(resId, null);

        ((ViewPager) collection).addView(view, 0);

        return view;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);

    }

    @Override
    public Parcelable saveState() {
        return null;
    }
}

仅供参考:ImageView“cicle”是屏幕底部的 4 个圆圈的图像,在页面更改时更新以显示您所在的屏幕。工作正常,只是想解释一下。

目标

在名为“forecast”的布局上更新名为“city”的文本视图。

提前感谢您的帮助!经过这个小障碍,应该很容易航行。

4

2 回答 2

3

好吧,我不保证这行得通,但是我在 ViewPager 使用兼容性包时遇到了类似的问题,我使用以下方法解决了这个问题:

在您的instatiateItem函数视图中,使用您的 resId 执行 setTag:

view.setTag(resId);

然后,当您需要更改“城市”时,请执行以下操作:

View baseLayout = myPager.findViewWithTag(R.layout.forecast);
TextView city = (TextView) baseLayout.findViewById(R.id.city_id);

R.id.city_id你的 TextView 的 id在哪里。

于 2012-05-21T03:07:57.637 回答
0

作为上述建议的一个小补充:

  1. 当标签是字符串时,出于某种奇怪的原因,它从未将标签分配给视图,并且总是为 findViewWithTag 返回 null。使用布局ID虽然有效。

  2. 确保您检索 onCreate() 之外的视图,最好是在您打算更改文本视图的文本的方法中。尝试在 onCreate 中访问它们会返回 null。我之前的理解是,只要你调用 MyPageAdapter,它就会调用 instantiateItem,所以应该很快就能找到视图。但事实并非如此。

我只是在上面两个问题上烧了一整天,因为在任何地方都没有真正提到它。希望它对未来的人们有所帮助。

于 2012-07-09T16:28:02.027 回答