【问题标题】:Access TextView in ViewPager from Activity从Activity访问ViewPager中的TextView
【发布时间】:2019-08-19 01:19:20
【问题描述】:

我有一个包含多个片段的 ViewPager 的 Activity。我现在如何访问其中一个片段中的 TextView 以从主要活动中更改其文本?我尝试了多种方法,它们都以 NullPointerException 结束。

活动:

public class SummonerOverview extends SherlockFragmentActivity implements TabListener, OnPageChangeListener {


    private ViewPager mPager;
    private PagerAdapter mAdapter;


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

        initialize();   
    }

    private void initialize() {

        // initialize Pager
        mPager = (ViewPager) findViewById(R.id.viewpager);
        mAdapter = new PagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mAdapter);
        mPager.setCurrentItem(1);
        mPager.setOnPageChangeListener(this);


        }
}

PagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter {

    public PagerAdapter(FragmentManager fm) {
        super(fm);
        frags = new Fragment[3];
        frags[0] = new StatisticsFragment(0);
        frags[1] = new RatingsFragment(1);
        frags[2] = new HistoryFragment(2);
    }

    private final int NUM_PAGES = 3;
    Fragment[] frags;

    @Override
    public Fragment getItem(int arg0) {
        if (arg0 == 0)
            return frags[0];
        else if (arg0 == 1)
            return frags[1];
        else
            return frags[2];
    }
    @Override
    public int getCount() {
        return NUM_PAGES;
    }

}

片段:

public class StatisticsFragment extends SherlockFragment {

public StatisticsFragment(int fragNr) {
        this.fragNr = fragNr;
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_overview_statistics, container, false);

        return v;
    }

}

StatisticsFragment 中的 Textview 在 fragment_overview_statistics.xml 中标有 id,但是当我尝试时

TextView tv = (TextView) findViewById(R.id.id_of_the_textview)
tv.setText("text");

在initialize() 方法之后,从Activity 的onCreate() 方法中,我得到一个异常。

【问题讨论】:

  • 首先尝试在onCreate 方法中查找TextView(你不应该这样做)是不正确的,因为Fragments 在那里不可用。如果此时需要设置文字,那么直接在片段类中移动文字的设置即可。
  • 片段(以及电视)第一次可用是什么时候?活动完全运行后(onResume 后)?也许这只是我的设计问题。我想显示一些我从互联网上获取的数据。我从创建 Activity、Viewpager 和 Fragments 开始。之后,我启动一个 AsyncTask 以从 Internet 获取数据并将解析的数据写入 AsyncTask 的 onPostExecute() 方法中的 TextViews。
  • 如果这就是你正在做的事情,我会在你的答案中选择解决方案。正如您需要为所有(我认为)片段设置 TextView 一样,只需重建它们即可。在onResume 方法中,片段应该是可用的。

标签: android android-fragments android-viewpager


【解决方案1】:

好的,经过一个小时的谷歌搜索,我想我解决了我自己的问题(尽管我确信有更好的方法来解决这个问题)

我现在在 MainActivity 中保存 Fragment 显示的所有数据,并通过使用 Activity 的公共方法使 Fragmet 在其 onCreateView() 方法中使用这些数据。

在 PagerAdapter 中,我将 getItemPosition() 重写为:

public int getItemPosition(Object object) {
    return POSITION_NONE;
}

现在,每次我更新一些数据时,我也会调用mAdapter.notifyDataSetChanged(),这会导致所有片段的重新生成。

它有效,虽然它对我来说看起来像一个糟糕的黑客。我确信必须有一个更好的解决方案,因为现在我必须重新创建所有片段以更改一个片段的一个 TextView,这肯定不是它打算完成的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多