2013-04-08 66 views
0

根据布局文件,仅从现有ImageView/TextBoxes保存字符串/图像的最佳方法是什么?我应该只检查一下我当前使用的布局(使用contentView变量)并基于那些现有文本框的保存或?将变量保存为onsavedinstance并确定它们是否为空

所以我有4个布局。风景和肖像:

  1. main.xml中
  2. imagefromsd.xml(对应布局SD)
  3. (从SD或应用程序本身选择图像之间进行选择)
  4. imagefromapplication(对应的应用程序布局)
  5. finishandupload.xml(我在哪里显示结果,并给予选项,保存/上传图片)

所以问题是我在使用protected void onSaveInstanceState(Bundle outState)protected void onRestoreInstanceState(Bundle savedInstanceState)在横向和纵向之间切换时会出现空指针异常。

发生这种情况是因为我从文本框和图像保存来自ImageViews的字符串,但并非每个布局文件都具有所有文本框,所以当我尝试从未出现的文本框中保存字符串时,会出现空指针异常。

现在我正在将当前contentView保存在变量中,当我更改setContentView时。

public void ShowLoadAPP(View v){ //Leave menu and show view for images from application 
    setContentView(R.layout.imagefromapplication); 
    contentView = R.layout.imagefromapplication; 
    LoadDrawables(); //Load list with images and show the first image 
} 

public void ShowLoadSD(View v){ //Leave menu and show view for images from sd 
    setContentView(R.layout.imagefromsd); 
    contentView = R.layout.imagefromsd; 
} 


@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onRestoreInstanceState(savedInstanceState); 

    setContentView(savedInstanceState.getInt("MyView")); 
    //Lines where application crashes because of nullpointer where the retrieved string doesn't exist. 

    ((ImageView)findViewById(R.id.imgMeme)).setImageResource(savedInstanceState.getInt("MyImage")); 
    ((EditText)findViewById(R.id.txtImageTop)).setText(savedInstanceState.getString("MyTopString")); 
    ((EditText)findViewById(R.id.txtImageButtom)).setText(savedInstanceState.getString("MyButtomString")); 
    ((ImageView)findViewById(R.id.imgMemeFinished)).setImageBitmap((Bitmap) savedInstanceState.getParcelable("MyBitmap")); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // TODO Auto-generated method stub 
    contentView = contentView == null ? R.layout.menu : contentView; 
    selectedImage = selectedImage == null ? R.drawable.are_you_fucking_kidding : selectedImage; 
    stringTop = ((EditText)findViewById(R.id.txtImageTop)).getText().toString() == null ? "" : ((EditText)findViewById(R.id.txtImageTop)).getText().toString(); 
    stringButtom = ((EditText)findViewById(R.id.txtImageButtom)).getText().toString() == null ? "" : ((EditText)findViewById(R.id.txtImageButtom)).getText().toString(); 
    combinedImage = combinedImage; 
    outState.putInt("MyView", contentView); 
    outState.putInt("MyImage", selectedImage); 
    outState.putString("MyTopString", stringTop); 
    outState.putString("MyButtomString", stringButtom); 
    outState.putParcelable("MyBitmap", combinedImage); 

    super.onSaveInstanceState(outState); 
} 

<ImageView 
    android:id="@+id/imgMemeFinished" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="50" 
    android:contentDescription="@string/imgMemeFinishedDescription" /> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

<Button 
    android:id="@+id/btnSave" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:onClick="SaveImage" 
    android:text="@string/btnSave" /> 

<Button 
    android:id="@+id/btnUpload" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:onClick="UploadImage" 
    android:text="@string/btnUpload" /> 
</LinearLayout> 

<ImageView 
    android:id="@+id/imgMeme" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="50" 
    android:contentDescription="@string/imgMemeDescription" /> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

<EditText 
    android:id="@+id/txtImageTop" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:ems="10" 
    android:inputType="text" 
    android:text="@string/txtImageTop" /> 

<EditText 
    android:id="@+id/txtImageButtom" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:ems="10" 
    android:inputType="text" 
    android:text="@string/txtImageButtom" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

<Button 
    android:id="@+id/btnPreviousImage" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:onClick="PreviousImage" 
    android:text="@string/btnPreviousImage" /> 

<Button 
    android:id="@+id/btnNextImage" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:onClick="NextImage" 
    android:text="@string/btnNextImage" /> 

<Button 
    android:id="@+id/btnFinish" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.25" 
    android:onClick="ShowFinish" 
    android:text="@string/btnFinish" /> 
</LinearLayout> 

回答

0

我建议你使用不同的活动不同的屏幕。 如果您计划将所有布局包含在同一活动中,请将它们放在同一个xml文件中,否则请在每个文件上使用不同的活动和布局。要通过活动传递和发送数据,您可以将信息放入您的Intent中,或者如果您需要更复杂的信息,请使用持久性内存(DB,sharedpreferences等)。

+0

用intents而不是1个活动重写了应用程序,现在很好。希望我没有必要,但哦:P – 2013-04-08 23:57:12