android - 重新加载 fragment 不起作用

标签 android android-fragments replace detach

我有以下情况: NavigationDrawer 创建一个 Fragment 来处理用户信息。 onCreateView() 上的 fragment 调用 Web 服务并返回 View 。当 Web 服务完成回调时,分离和附加自身的 fragment 。当第二次在 onCreateView() 上附加 Fragment 时,应该创建一个包含用户信息的 View 。但实际上发生的是 View 没有改变。

我错过了什么?

提前谢谢你,

fragment 代码:

private boolean mIsRefresh = false;

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

    // Gets Application Context
    mContext = getActivity().getApplicationContext();

    // Set up environment to use DataBase
    mGlobal = (Global) getActivity().getApplicationContext();
    mDAOFactory = mGlobal.getDAOFactory();

    mFragment = this;

    mFragmentView = inflater.inflate(R.layout.fragment_user_info, container, false);


    buildView();

    if (mIsRefresh) {
        return mFragmentView;
    }else {
        return null;
    }
}

这是 buildView() 代码:

private void buildView() {

    mEtUserName = (EditText) mFragmentView.findViewById(R.id.userName);
    mEtUserEmail = (EditText) mFragmentView.findViewById(R.id.userEmail);
    mEtPassword = (EditText) mFragmentView.findViewById(R.id.password);
    mEtPasswordConfirmation = (EditText) mFragmentView.findViewById(R.id.passwordConfirmation);
    mIbSendPassword = (ImageButton) mFragmentView.findViewById(R.id.sendPassword);
    mAcUserCountry = (AutoCompleteTextView) mFragmentView.findViewById(R.id.userCountry);
    mEtUserState = (EditText) mFragmentView.findViewById(R.id.userState);
    mEtUserCity = (EditText) mFragmentView.findViewById(R.id.userCity);
    mEtUserPhoneNumberCountry = (EditText) mFragmentView.findViewById(R.id.userPhoneNumberCountry);
    mEtUserPhoneNumberCity = (EditText) mFragmentView.findViewById(R.id.userPhoneNumberCity);
    mEtUserPhoneNumber = (EditText) mFragmentView.findViewById(R.id.userPhoneNumber);
    mCbTCAccepted = (CheckBox) mFragmentView.findViewById(R.id.cbTCAccepted);


    // User has not been created
    if (mGlobal.getUserUID() == 0) {
        getUserEmail();
        getUserLocation();

    } else {
        if (mIsRefresh) {
            formatView();
        } else {
            getDataOnServer();
        }
    }

}

这是调用 Web 服务的代码:

private void getDataOnServer () {

    mUserDAO = mDAOFactory.getUserDAO(mContext);

    final ProgressDialog progressDialog = ProgressDialog.show (getActivity(),
            getString(R.string.msgConnectingServer), getString(R.string.msgGettingData), true);

    //TODO Retirar o set abaixo
    mGlobal.setUserUID(1);

    mUserDAO.getUserByUID(mGlobal.getUserUID(), new Callback<User>() {
        @Override
        public void success(User user, Response response) {
            mUser = user;
            mIsRefresh = true;
            refresh();
        }

        @Override
        public void failure(RetrofitError error) {
            mUser = null;
            Log.e(getClass().getName(), "Retrofit Error = " + error);
            refresh();
        }

        private void refresh() {
            progressDialog.dismiss();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.detach(mFragment)
                    .attach(mFragment)
                    .commit();

        }
    });
}

最后是 onStart()

@Override
public void onStart() {
    super.onStart();

    if (mIsRefresh) {
        mIsRefresh = false;
        getFragmentManager().beginTransaction()
                .remove(mFragment)
                .add(R.id.content_frame, mFragment)
                .commit();
    }

}

最佳答案

代替

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.detach(mFragment).attach(mFragment).commit();

这样做:

    YourFragment mFragment = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG"); //if you are using support library
     //OR
   YourFragment mFragment = getFragmentManager().findFragmentByTag("Your_Fragment_TAG"); //if you are using support library

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.detach(mFragment);
    ft.attach(mFragment).commit();

关于android - 重新加载 fragment 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30951745/

相关文章:

java - 空闲内存是否在 Android 设备上消耗更少的电量?

android - 日期选择器对话框监听器

java - 使用 FragmentTabHost 时出现 ClassCastException

regex - 替换 R 中的单个反斜杠

javascript - jQuery - 替换字符串中的所有括号

jquery - javascript/jquery 输入字段清理

android - 使用dlopen动态加载x86 android .so文件,出现 undefined symbol 错误

Android 4.2 - 文本渲染错误 - 文本闪烁并被剪切

java - 在滑动选项卡布局中停留在同一选项卡中时切换到不同的 fragment

android - 应用程序未在 kindle 设备上显示(仅在非亚马逊设备上显示)