Android | TextView.setText()不起作用

时间:2015-12-28 04:51:56

标签: android android-fragments textview

所以我有这么复杂的片段。它是ViewPager中使用的片段,它由自己的CursorLoader填充,还包含ListFragment添加的一些getChildFragmentManager()

onCreate()我分配视图元素和initiat Loader就像这样

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.user_account, container, false);

    mUserName = (TextView) v.findViewById(R.id.user_account_full_name);
    mUserLastSeen = (TextView) v.findViewById(R.id.user_account_user_last_seen);
    mCreditBalance = (TextView) v.findViewById(R.id.user_account_credit_balance);
    ...

    // then I populate FrameLayouts with ListViewFragments
    FragmentTransaction ft = getChildFragmentManager().beginTransaction();
    ft.add(R.id.user_account_credit_history, CreditListFragment.newInstance(mUserId));
    ft.add(R.id.user_account_bill_consumption, ConsumptionListFragmentAccount.newInstance(mUserId));
    ft.commit();

    // initiating the Loader
    getActivity().getSupportLoaderManager().initLoader(0, null, this);

    return v;
}

最后在onLoadFinished()我希望填充我的观点

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    data.moveToFirst();
    Log.e("TAG", data.getString(UserId.NAME));
    mUserName.setText(data.getString(UserId.NAME));
    mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
            (data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
                    String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
    Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
}

但未填充ViewLog.e(...)按预期编写用户名,因此启动Loader广告包含有效数据,但我的TextView都没有被数据替换,这非常非常奇怪。< / p>

有什么想法吗?

编辑 /知道了!

解决方案开始回答。非常感谢Shoeb Siddique,感谢您的帮助!你是明星!

3 个答案:

答案 0 :(得分:2)

  mUserName = (TextView) v.findViewById(R.id.user_account_full_name);
    handler.post(new Runnable() {
                public void run() { 

                 mUserName.setText(data.getString(UserId.NAME));
        mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
                (data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
                        String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
        Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
                } 
            }); 

答案 1 :(得分:1)

您可以使用用户界面线程 runOnUiThread

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    data.moveToFirst();
    Log.e("TAG", data.getString(UserId.NAME));
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            mUserName.setText(data.getString(UserId.NAME));
            mUserLastSeen.setText(getString(R.string.last_seen) + ": " +
                    (data.isNull(UserId.LAST_VISIT) ? getString(R.string.never) :
                            String.format("%te. %<tB %<tY", data.getLong(UserId.LAST_VISIT))));
        }
    });

    Utils.setColorCurrency(mCreditBalance, data.getFloat(UserId.ACCOUNT_BALANCE));
}

答案 2 :(得分:0)

由于ViewPager有很多兄弟Fragment,我在所有兄弟姐妹中都使用了相同的loaderId = 0

如果存在相同ContextloaderIdLoaderCallbacks的加载程序,LoaderManager.initLoader()将返回已创建的加载程序,因此我的所有碎片共享一个Loader

发起Fragment冷杉的Loader让我们称之为clickFragment,而LoaderCallbacks没有填充clickFragment,所有碎片都是{{1} ,clickFragment右侧/下方的所有片段都填充了clickFragment的数据。因此clickFragment启动了Loader,并且ViewPager准备了兄弟碎片,数据被传递到所有正确的碎片。奇怪的是,clickFragment本身并没有填充,我没有将视图滑动到兄弟姐妹,所以我看到空View并且感到困惑。

现在我为每个片段生成唯一的loaderId,它最终有效。