android onSaveInstanceState使用情况

android onSaveInstanceState使用情况,android,savechanges,Android,Savechanges,请在下面的课程中指导我应该保存什么 请记住,我只使用了一个字符串,即我正在从getextra方法中检索,并且我认为我不应该在下面的重写方法中存储任何内容 protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); } 您能指导我在onsave实例方法中存储什么,不存储什么吗 package

请在下面的课程中指导我应该保存什么

请记住,我只使用了一个字符串,即我正在从getextra方法中检索,并且我认为我不应该在下面的重写方法中存储任何内容

protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
}
您能指导我在onsave实例方法中存储什么,不存储什么吗

package com.wozzon.activity;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

import com.wozzon.json.JSONService;
import com.wozzon.model.SearchCriteria;
import com.wozzon.pl.UIFactory;
import com.wozzon.util.Util;
import com.wozzon.util.WLConstants;

public class HomeBrowse extends Activity implements OnItemClickListener{
    private final static String TAG = HomeBrowse.class.getSimpleName();
    private ArrayList<BrowseRow> model=new ArrayList<BrowseRow>();
    private BrowseAdapter adapter;
    private ListView list;
    private TextView browseTitle;
    private TextView changeLink;
    private SearchCriteria sc =SearchCriteria.getInstance();

    private JSONArray jsonArray;
    private ProgressDialog m_ProgressDialog = null; 
    private Runnable progressRunnable;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.browse);
            String errorMsg =Util.getExtraValue(getIntent().getExtras(), WLConstants.ERROR_MSG); 
            list =(ListView)findViewById(R.id.browse_cats);
            if(errorMsg!= null){
                UIFactory.displayAlert(new AlertDialog.Builder(HomeBrowse.this), "Status", errorMsg);
            }
            progressRunnable = new Runnable(){
                @Override
                public void run() {
                 try {

                    loadData();
                    } catch (Throwable e) {
                        Log.e(TAG, e.getMessage());
                        }
                     runOnUiThread(returnRes);
                }
            };
            m_ProgressDialog = ProgressDialog.show(HomeBrowse.this,    
                      "Please wait...", "Loading ...", true);
            Thread thread = new Thread(progressRunnable);
            thread.start();
        } catch (Throwable e) {
            Log.e(TAG, e.getMessage());
            Util.handleError(HomeBrowse.this, HomeBrowse.class, e.getMessage());
            //UIFactory.displayAlert(new AlertDialog.Builder(HomeBrowse.this), "Error Loading categories", e.getMessage());
        }
    }

    private void loadData()throws Throwable{//loading object

        jsonArray = JSONService.getJsonArray(getResources().getString(R.string.catJson));

    }
    private void fillResultRows(JSONArray jsonArray, BrowseAdapter adapter)throws Throwable{
        BrowseRow br = null;
        try {
            for(int a=0; a<jsonArray.length(); a++){
                JSONObject jsonObj = jsonArray.getJSONObject(a);
                br = new BrowseRow();
                br.name=jsonObj.getString("title");
                br.image=jsonObj.getString("image");
                br.searchType = jsonObj.getInt("searchType");

                if(jsonObj.has("categoryIds")){
                    br.categoryIds = jsonObj.getString("categoryIds").replaceAll("-", ",");
                }
                if(jsonObj.has("subCategoryIds")){
                    br.subCategoryIds = jsonObj.getString("subCategoryIds").replaceAll("-", ",");
                }
                adapter.add(br);
            }
        } catch (Throwable e) {
            throw e;
        }

        }

    class BrowseAdapter extends ArrayAdapter<BrowseRow> {
        BrowseAdapter() {
            super(HomeBrowse.this, android.R.layout.simple_list_item_1, model);
        }

        public View getView(int position, View convertView,
                                                ViewGroup parent) {
            View row=convertView;
            ResultWrapper wrapper=null;

            if (row==null) {                                                    
                LayoutInflater inflater=getLayoutInflater();

                row=inflater.inflate(R.layout.browse_row, null);
                wrapper=new ResultWrapper(row);
                row.setTag(wrapper);
            }
            else {
                wrapper=(ResultWrapper)row.getTag();
            }

            wrapper.populateFrom(model.get(position));
            return(row);
        }
    }
    class ResultWrapper {
        private TextView name;
        private String catIds="0";
        private String subCatIds="0";
        private ImageView image;
        private int searchType;

        private View row=null;

        ResultWrapper(View row) {
            this.row=row;
        }

        void populateFrom(BrowseRow r) {
            getName().setText(r.name);
            getIcon().setImageResource(getImageIcon(Integer.parseInt(r.image)));
            catIds =r.categoryIds;
            subCatIds = r.subCategoryIds;
            searchType =r.searchType;
        }
        TextView getName() {
            if (name==null) {
                name=(TextView)row.findViewById(R.id.browse_row_name);
            }
            return name;
        }
        ImageView getIcon() {
            if (image==null) {
                image=(ImageView)row.findViewById(R.id.browse_row_icon);
            }
            return image;
        }


    }

    private int getImageIcon(int catId){

        int imageSource=R.drawable.all_cats;

        switch(catId){
        case WLConstants.CATEGORY_FILM: imageSource =R.drawable.film; break;  
        case WLConstants.CATEGORY_MUSIC: imageSource =R.drawable.music; break;
        case WLConstants.CATEGORY_ARTS: imageSource =R.drawable.art; break;
        case WLConstants.CATEGORY_KIDS: imageSource =R.drawable.museum; break;
        case WLConstants.CATEGORY_GALLERY_MUSEUM: imageSource =R.drawable.kids; break;
        case WLConstants.CATEGORY_COMEDY: imageSource =R.drawable.comedy; break;
        case WLConstants.CATEGORY_NIGHT_CLUBS: imageSource =R.drawable.clubs; break;
        case WLConstants.CATEGORY_ATTRACTION: imageSource =R.drawable.touristattractions; break;
        case WLConstants.CATEGORY_VARIOUS_EVENTS: imageSource =R.drawable.all_cats; break;
        case WLConstants.CATEGORY_ALL_FOOD_DRINK: imageSource =R.drawable.restaurants; break;
        }
        return imageSource;
    }
    @Override
    public void onItemClick(AdapterView<?> adp, View view, int item, long arg3) {

        try {
            if("".equals(sc.getSearchLocation()) && (!(Util.locationFound(sc.getGeoLocation()) && sc.isUK()))){
                UIFactory.displayAlert(new AlertDialog.Builder(HomeBrowse.this), "Error", "Please provide location");
                return;
            }
                ResultWrapper wrap = (ResultWrapper)view.getTag();
                sc.setCategoryIds(wrap.catIds);
                sc.setSubCategoryIds(wrap.subCatIds);
                sc.setSearchType(wrap.searchType);
                goSearch();
        } catch (Throwable e) {
            Log.e(TAG, e.getMessage());
            Util.handleError(HomeBrowse.this, HomeBrowse.class, e.getMessage());
            //UIFactory.displayAlert(new AlertDialog.Builder(this), "Error", e.getMessage());
        }
    }
    private void applyListener(){
        list.setOnItemClickListener(this);
        changeLink.setOnClickListener(onclickListener);

    }
    private final void goSearch(){
          try {
              sc.setSearchString("");
              Intent mainIntent = new Intent(HomeBrowse.this,SearchResults.class); 
              startActivity(mainIntent); 
        } catch (Throwable e) {
            Log.e(TAG, e.getMessage());
            Util.handleError(HomeBrowse.this, HomeBrowse.class, e.getMessage());
        }

      }
    public OnClickListener onclickListener = new OnClickListener(){ 
        // @Override 
        public void onClick(View aView) {
             try {
                int componentId =aView.getId();
                 switch(componentId){
                 case R.id.tv_changeDateType: 
                     Intent intent = new Intent(HomeBrowse.this,TimeLocationSettings.class);
                     startActivity(intent);
                     break;
                 }
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
                Util.handleError(HomeBrowse.this, HomeBrowse.class, e.getMessage());
            }
        }

  }; 

  private void configComponents(){
      String titleStr,location = "";
      String dateCrtStr = Util.getDateCritieraStr(sc.getDateCriteria());
      titleStr= dateCrtStr;
      if(!"".equals(sc.getSearchLocation())){
          location = sc.getSearchLocation();
      }else if(sc.isNearMe()){
          location="Near me";
      }else{
          location = "Postcode or town";
      }
      titleStr = titleStr + " - "+ location;
      browseTitle.setText(titleStr);
      changeLink.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
      }


  public class BrowseRow {

        private String name = "";
        private String image = "";
        private String categoryIds="0";
        private String subCategoryIds="0";
        private int searchType=1;

    }
  private Runnable returnRes = new Runnable() {
        @Override
        public void run() {
            try {
                browseTitle = (TextView)findViewById(R.id.browsePageTite);
                changeLink = (TextView)findViewById(R.id.tv_changeDateType);
                changeLink.setText(Html.fromHtml("<a href='#'>Change</a>"));
                adapter=new BrowseAdapter();
                applyListener();
                configComponents();
                fillResultRows(jsonArray, adapter);
                if(jsonArray == null){
                    UIFactory.displayAlert(new AlertDialog.Builder(HomeBrowse.this), "Error", "Error Loading categories");
                    return;
                }
                list.setAdapter(adapter);
            } catch (Throwable e) {
                e.printStackTrace();
            } 
            m_ProgressDialog.dismiss();
        }
      };
}

您应该保存所有描述视图状态的内容,而这些内容没有保存在其他位置


保存用户在EditText中的位置、EditText的值、当前显示的对话框等。当用户离开应用程序并返回到应用程序时,应用程序应该能够从返回的捆绑包中重建其所处的确切状态。

不一定是所有内容,因为

默认实现通过在层次结构中具有id的每个视图上调用onSaveInstanceState,并通过保存当前聚焦视图的id来为您处理大多数UI逐实例状态,所有这些都由onRestoreInstanceStateBundle的默认实现还原

通过


但是如果重写,则必须自己处理整个状态。

记事本教程练习3中有一个保存和恢复实例状态的示例和说明。我建议通读一遍,以便更好地理解这些概念:是的,在另一种情况下,选择一个有效但完全错误的答案是有帮助的。谢谢你的纠正尽管我甚至不同意你的观点:如果你推翻,你必须自己处理整个州,嗯,不;您仍然可以通过super调用基类方法;对@Faisalkkhan的Q的回答是不一致的。您应该保存所有描述视图状态的内容,而这些内容没有保存在其他位置,这是正确的,但是您必须保存的内容是错误的,例如,用户在EditText中的位置,EditText的值是多少。看到LeszekGruchalaI的回答,我同意,我相信这种行为已经改变,因为我最初的回答。