Android碎片问题

时间:2011-11-16 09:15:13

标签: java android android-fragments

我很难获取片段来更新他们的视图......具体来说,是ViewPager中存在的ActionBarSherlock片段。

这是我的片段类:

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并失败。我很难理解为什么会这样。有人曾向我提到过,因为我的碎片没有附加任何东西......我不太明白这一部分,不仅如此,我只是不明白为什么如果onCreateView第一次成功,getView()指向null? getView()没有得到onCreateView返回的View吗?以下是完整的代码集:https://gist.github.com/1369653

1 个答案:

答案 0 :(得分:3)

所以过了一段时间,我想通了......问题来自于FragmentPagerAdapter如何返回片段......

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

每次调用getItem()时都会返回一个新片段。但是,我也有......

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

在将新片段添加到适配器之前创建了新片段。所以适配器正在接收一个新片段并返回一个新片段而不是返回我给它的相同片段。所以我只是改变了getItem()函数,如果没有相同的类已经存在,则返回一个NEW片段。