安卓碎片问题

4

我在更新片段视图时遇到了困难...特别是,这些片段存在于带有ActionBarSherlock的ViewPager中。

这是我的片段类:

public class SearchFragment extends Fragment{
private String mInterests;
private String mSentence;

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

@Override
public void onResume() {
    super.onResume();
    getUserInterests();
}

/*
 * Get the users interests from the underlying
 * data store.
 */
public void getUserInterests() {
    TextView tv = (TextView) getView().findViewById(R.id.bounty_search_txtResult);
    DatabaseHelper dbHelper = new DatabaseHelper(getActivity());
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    Cursor cursor = db.query(DatabaseConstants.TABLE_NAME, null, null, null, null, null, null);
    cursor.moveToFirst();
    mInterests = cursor.getString(cursor.getColumnIndex(DatabaseConstants.INTERESTS));
    if(mInterests.length() == 0) {
        mSentence = "You have no interests.";
    }
    else {
        mSentence = "Your interests are: ";
        mInterests = cursor.getString(cursor.getColumnIndex(DatabaseConstants.INTERESTS));
    }
    tv.setText(mSentence + mInterests);
    cursor.close();
    db.close();
    dbHelper.close();
}
}

我从FragmentActivity调用这个片段的方式如下...
SearchFragment searchInterests = new SearchFragment();

当片段首次运行时,我的视图已经正确设置,但是当我调用类似于...

searchInterests.update();

从FragmentActivity中更新某些视图,需要在getView()方法中进行操作。

TextView tv = (TextView) getView().findViewById(R.id.results);

返回 null 并失败。我很难理解为什么会这样。有人告诉我,这是因为我的 Fragment 没有附加到任何东西上... 我不太理解这一部分,而且我也不理解为什么如果 onCreateView 第一次成功,getView() 会指向 null? getView() 不是获取 onCreateView 返回的 View 吗?以下是完整的代码集:https://gist.github.com/1369653

1个回答

3

经过一段时间的研究,我找到了问题所在...问题出在FragmentPagerAdapter返回fragment的方式上...

@Override
public Fragment getItem(int position) {
    return Fragment.instantiate(mContext, mTabs.get(position), null);
}

每次调用getItem()时,它都会返回一个新的fragment。然而,我还有...

searchInterests = new SearchFragment();
selectInterests = new SelectFragment();

在添加到适配器之前,先创建了一个新的片段。因此适配器接收到一个新的片段并返回一个新的片段,而不是返回我给它的相同的片段。因此,我只需更改getItem()函数,如果不存在相同类的片段,则返回一个新的片段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接