android fragment activity 生命周期,Android Fragment生命周期问题(onActivityResult上的...

我遇到一个问题,我找不到任何解释.

我有一个FragmentActivity,它使用TabManager显示片段,如下所示:

public class WorkOrderFormTabFragmentActivity extends FragmentActivity {

TabHost mTabHost;

TabManager mTabManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.work_order_form_tab_new);

mTabHost = (TabHost)findViewById(android.R.id.tabhost);

mTabHost.setup();

mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);

mTabManager.addTab(mTabHost.newTabSpec("form").setIndicator("Form"),

WorkOrderFormFragment.class, null);

mTabManager.addTab(mTabHost.newTabSpec("pictures").setIndicator("Pictures"),

PictureListFragment.class, null);

if (savedInstanceState != null) {

mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));

}

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString("tab", mTabHost.getCurrentTabTag());

}

public static class TabManager implements TabHost.OnTabChangeListener {

private final FragmentActivity mActivity;

private final TabHost mTabHost;

private final int mContainerId;

private final HashMap mTabs = new HashMap();

TabInfo mLastTab;

static final class TabInfo {

private final String tag;

private final Class> clss;

private final Bundle args;

private Fragment fragment;

TabInfo(String _tag, Class> _class, Bundle _args) {

tag = _tag;

clss = _class;

args = _args;

}

}

static class DummyTabFactory implements TabHost.TabContentFactory {

private final Context mContext;

public DummyTabFactory(Context context) {

mContext = context;

}

@Override

public View createTabContent(String tag) {

View v = new View(mContext);

v.setMinimumWidth(0);

v.setMinimumHeight(0);

return v;

}

}

public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) {

mActivity = activity;

mTabHost = tabHost;

mContainerId = containerId;

mTabHost.setOnTabChangedListener(this);

}

public void addTab(TabHost.TabSpec tabSpec, Class> clss, Bundle args) {

tabSpec.setContent(new DummyTabFactory(mActivity));

String tag = tabSpec.getTag();

TabInfo info = new TabInfo(tag, clss, args);

info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);

if (info.fragment != null && !info.fragment.isDetached()) {

FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

ft.detach(info.fragment);

ft.commit();

}

mTabs.put(tag, info);

mTabHost.addTab(tabSpec);

}

@Override

public void onTabChanged(String tabId) {

TabInfo newTab = mTabs.get(tabId);

if (mLastTab != newTab) {

FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

if (mLastTab != null) {

if (mLastTab.fragment != null) {

//ft.detach(mLastTab.fragment);

ft.hide(mLastTab.fragment);

}

}

if (newTab != null) {

if (newTab.fragment == null) {

newTab.fragment = Fragment.instantiate(mActivity,

newTab.clss.getName(), newTab.args);

ft.add(mContainerId, newTab.fragment, newTab.tag);

} else {

//ft.attach(newTab.fragment);

ft.show(newTab.fragment);

}

}

mLastTab = newTab;

ft.commit();

mActivity.getSupportFragmentManager().executePendingTransactions();

}

}

}

在FragmentActivity的第二个选项卡中,用户可以管理图片列表,并使用相机添加更多图片.

片段代码:

public class PictureListFragment extends Fragment {

static final int TAKE_PICTURE_ACTIVITY = 1;

static final int EDIT_PICTURE_ACTIVITY = 2;

FormPictureListAdapter lvAdapter;

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup viewgrp,

Bundle savedInstanceState) {

// Inflate the layout for this fragment

View cont = inflater.inflate(R.layout.form_picture_list, viewgrp, false);

LinearLayout container = (LinearLayout)cont.findViewById(R.id.formPictureListLayout);

try{

final Context context = getActivity();

ListView ls2 = new ListView(context);

// clear previous results in the LV

ls2.setAdapter(null);

// populate

ArrayList pictures = new ArrayList();

//pictures.add(0, new MFPicture());

pictures.addAll(((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures());

lvAdapter = new FormPictureListAdapter(context, pictures);

ls2.setAdapter(lvAdapter);

LinearLayout.LayoutParams Params = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, 0, 1f);

ls2.setLayoutParams(Params);

ls2.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView> parent, View view,

int position, long id) {

final MFPicture picture = ((MFPictureView)view).getPicture();

final int idx = position;

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

switch (which){

case DialogInterface.BUTTON_POSITIVE:

//Edit picture

EditPictureActivity.setPicture(picture);

Intent configurationOpen = new Intent(getActivity(), EditPictureActivity.class);

startActivityForResult(configurationOpen, EDIT_PICTURE_ACTIVITY);

break;

case DialogInterface.BUTTON_NEGATIVE:

//Delete picture

((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures().remove(idx);

MFUtils.deleteFile(picture.getPath());

lvAdapter.updatePictureList(((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures());

lvAdapter.notifyDataSetChanged();

break;

}

}

};

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

builder.setMessage(getResources().getString(R.string.wo_bem_regie_list_el_action)).setPositiveButton(getResources().getString(R.string.wo_bem_regie_list_el_edit), dialogClickListener)

.setNegativeButton(getResources().getString(R.string.wo_bem_regie_list_el_delete), dialogClickListener).show();

}

});

container.addView(ls2);

LayoutInflater layoutInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View view=layoutInflater.inflate(R.layout.add_btn_bottom,container);

view.setBackgroundResource(R.drawable.list_selector_even);

TextView text = (TextView)view.findViewById(R.id.title);

text.setText(getResources().getString(R.string.wo_picturelist_add));

view.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v){

v.setBackgroundResource(R.drawable.list_selector_even);

String pictureFile = ((MFApplication)getActivity().getApplication()).getNextPictureFile();

String picPath = MFUtils.MF_STORAGE_PATH+"/"+pictureFile;

Log.e("FormPictureListActivity", "PicturePath : "+picPath);

//setBackgroundResource(android.R.drawable.list_selector_background);

try {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(picPath)));

startActivityForResult(intent, TAKE_PICTURE_ACTIVITY);

} catch (ActivityNotFoundException e) {

Log.e("FormPictureListActivity", "Call failed", e);

}

}

});

}

catch(Exception e){

e.printStackTrace();

Log.e("FormPictureListActivity", "Error:", e);

}

return cont;

}

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

//super.onActivityResult(requestCode, resultCode, data);

String pictureFile = ((MFApplication)getActivity().getApplication()).getPictureFile();

Log.d("FormPictureListActivity", "ActivityResult:"+resultCode);

Log.d("FormPictureListActivity", "ActivityResult-picFile:"+pictureFile);

if (requestCode == TAKE_PICTURE_ACTIVITY){

if(resultCode == getActivity().RESULT_OK){

Log.d("FormPictureListActivity", "ActivityResult:OK");

MFPicture picture = new MFPicture(MFPicture.TYPE_PICTURE, MFUtils.MF_STORAGE_PATH+"/"+pictureFile);

((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures().add(picture);

lvAdapter.updatePictureList(((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures());

lvAdapter.notifyDataSetChanged();

EditPictureActivity.setPicture(picture);

Intent configurationOpen = new Intent(getActivity(), EditPictureActivity.class);

startActivityForResult(configurationOpen, EDIT_PICTURE_ACTIVITY);

}

}

else if (requestCode == EDIT_PICTURE_ACTIVITY){

EditPictureActivity.getPicture().setComment(EditPictureActivity.getPicture().getCommentUIValue());

lvAdapter.updatePictureList(((MFApplication)getActivity().getApplication()).getCurrentForm().getPictures());

lvAdapter.notifyDataSetChanged();

}

}

}

一切都可以在我的测试设备(Nexus 5,Galaxy Nexus,Galaxy Mini 2)上正常运行,但是我会不时收到其他我无法访问的设备(主要是运行Android 4.0.4的设备)的错误消息:

java.lang.RuntimeException: Unable to resume activity

{com.mf.mobile.android/com.mf.mobile.android.WorkOrderFormTabFragmentActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131073, result=-1, data=null} to activity {com.mf.mobile.android/com.mf.mobile.android.WorkOrderFormTabFragmentActivity}: java.lang.NullPointerException

at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2616)

at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130)

at android.app.ActivityThread.access$600(ActivityThread.java:135)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1248)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:4645)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:511)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)

at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131073, result=-1, data=null} to activity {com.mf.mobile.android/com.mf.mobile.android.WorkOrderFormTabFragmentActivity}: java.lang.NullPointerException

at android.app.ActivityThread.deliverResults(ActivityThread.java:3156)

at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2599)

... 12 more

Caused by: java.lang.NullPointerException

at com.timewise.mobile.android.fragments.PictureListFragment.onActivityResult(PictureListFragment.java:138)

at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:166)

at android.app.Activity.dispatchActivityResult(Activity.java:4662)

at android.app.ActivityThread.deliverResults(ActivityThread.java:3152)

... 13 more

NPE出现在以下代码行中:

????lvAdapter.updatePictureList(((MframeApplication)getActivity()getApplication())getCurrentForm()getPictures());

这意味着此时lvAdapter变量为null.但是这个变量应该已经在Fragment的onCreateView中设置了.这使我认为,在某些时候,可能已经在不调用onCreateView的情况下重新创建了Fragment.

我找不到有关此问题的任何解释.你能帮我这个忙吗?

非常感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值