2010-08-13 84 views
0

还有一个问题,这个是BAFFLING!动态添加视图和崩溃

我们走吧。

我们有一个布局......

<?xml version="1.0" encoding="utf-8"?> 
<!-- Template for creating a result in MediaUpload --> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:isScrollContainer="true" 
     android:focusableInTouchMode="false" 
     android:focusable="false"> 
     <ImageView android:id="@+id/imgView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:maxWidth="110dp" 
     android:maxHeight="110dp" 
     android:minWidth="110dp" 
     android:minHeight="110dp" 
     android:layout_gravity="center_vertical" 
     android:padding="3dp" 
     android:scaleType="center" 
     android:clickable="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:saveEnabled="true"/> 
     <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center_horizontal"> 
     <TextView android:id="@+id/img_file_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="@color/LinkText" 
     android:textStyle="bold" 
     android:paddingBottom="3dp"/> 
     <EditText android:id="@+id/img_title" 
     android:hint="Title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:minWidth="150dp" 
     android:maxHeight="50dp" 
     android:inputType="textVisiblePassword" 
     android:maxLength="255"/> 
     <EditText android:id="@+id/img_desc" 
     android:hint="Description" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:minWidth="150dp" 
     android:maxHeight="50dp" 
     android:maxLength="255"/> 
     </LinearLayout> 
    </LinearLayout> 
    <ImageView 
     android:src="@drawable/divider" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitXY" 
     android:paddingTop="2dp" 
     android:paddingBottom="2dp"> 
    </ImageView> 
</LinearLayout> 

我们在这里用这个作为一个对象,用户可以上传到我们网站的模板。 (这是一个庞大的布局,所以只是发布我们附加的内容)。

<LinearLayout android:id="@+id/list_of_images" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
</LinearLayout> 

Soo ...这是实际的问题。当用户从他们的图库中选择图像时,它会正确添加到我们的LinearLayout。现在,我们的一名员工一直都有低内存问题,并且他在拍照或浏览时关闭应用程序。我们的应用程序设置为在用户将应用程序保存到savedInstanceState方法之前立即保存所有数据(数据为Uri,标题文本,说明文本等)。

/* 
    * The Activity is being recycled and needs to have its instance 
    * saved before we lost all of the image URis! 
    */ 
    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     helper.saveEnteredData(); 
     outState.putParcelableArray(IMAGE_URI_BUNDLE_KEY, helper.getUploadObjectArray()); 
     outState.putParcelable(CAPTURE_IMAGE_URI_BUNDLE_KEY, currentFileURI); 

     outState.putInt(CURRENT_JOB_BUNDLE_KEY, reportSpinner.getSelectedItemPosition()); 

     ArrayList<ReportInfoParcelable> alReps = new ArrayList<ReportInfoParcelable>(); 
     for(int i = 0; i < reportList.length; ++i) 
      alReps.add(new ReportInfoParcelable(reportList[i])); 

     outState.putParcelableArray(JOB_LIST_BUNDLE_KEY, alReps.toArray(new ReportInfoParcelable[alReps.size()])); 
    } 

这里是helper.saveEnteredData()...

public void saveEnteredData() 
    { 
     ViewGroup vg = null; 
     UploadObject object = null; 
     String title, desc; 
     for(int i = 0; i < mLinearLayout.getChildCount(); i++) 
     { 
      vg = (ViewGroup) mLinearLayout.getChildAt(i); 
      object = alUploadObjects.get(i); 
      title = ((TextView) vg.findViewById(R.id.img_title)).getText().toString(); 
      desc = ((TextView) vg.findViewById(R.id.img_desc)).getText().toString(); 
      object.setTitle(title); 
      object.setDesc(desc); 
     } 
    } 

当从崩溃后的用户留下的活动,当我们通过应用程序调试上的回报,该阵列的应用收益返回的UploadObjects包含所有正确的Uri,标题和描述,但是当应用程序最终显示时,我们追加的LinearLayout上的所有editTexts都突然包含Parcelable数组中最后一个UploadObject的标题和描述。再次,我们通过每次追加对象进行调试,并且对象包含正确的数据。我们很困惑,需要一些帮助!

+0

作为额外的评论,因为我们正在从崩溃中恢复,所以在onCreate方法中,我们解析出ReportInfoParcelable数组。那里的数据也是正确的。 – DavidAndroidDev 2010-08-13 15:56:00

回答

0

我们明白了!

不完全确定这里发生了什么,但是我们覆盖(sp?)onPostCreate(Bundle)方法并在这里解析出包,而我们的问题已修复。在onCreate()中有一些关于膨胀xml文件的问题,这会导致一些错误。无论如何,如果你不得不膨胀一个XML(除了你的常规布局),那么在onPostCreate()上做!