首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从睡眠模式恢复时保持GridView

从睡眠模式恢复时保持GridView
EN

Stack Overflow用户
提问于 2012-11-26 17:38:55
回答 4查看 1.7K关注 0票数 12

我遇到了一个相当大的GridView的问题。(大约70个孩子),如果我在onCreate上启动它,或者在按了home按钮后重覆之后,然后返回的话,GridView就能正常工作。但是,当我从睡眠模式返回之后,我的BaseAdapter再次启动,并破坏了我在运行时对它所做的更改。这也使getChildAt()在重新启动后调用它时提供了一个NullPointerException。

我如何才能让它只做常规的onPause(家庭按钮)做的GridView,并避免GridView被抹掉每次我从睡眠模式?

编辑:我尝试为我的活动类设置一个唤醒锁,它调用BaseAdpter时没有运气。

2.编辑:自从我发布了这个问题以来,我一直在尝试使用GridView中的代码恢复onPause:

代码语言:javascript
复制
 SparseArray<Parcelable> array = new SparseArray<Parcelable>();
    gridView.saveHierarchyState(array);
    bundle = new Bundle();
    bundle.putSparseParcelableArray("state", array);

这在onResume中是:

代码语言:javascript
复制
 try{
    gridView.restoreHierarchyState(bundle.getSparseParcelableArray("state"));
    }
    catch(Exception e){
        //Most likely first start
        Log.i("SomeTag", "No GridView state found");
    }

    }

奇怪的是,我似乎在屏幕上从一个地方跳到另一个地方,当我尝试getChildAt()时,它仍然崩溃。在睡眠模式之后,它也无法得到它。

  1. 编辑这里是来自BaseAdapter getView的代码(注意!这些代码中有些是不相关的)

公共视图getView (int位置,查看convertView,ViewGroup父){

代码语言:javascript
复制
mParentView = parent;


DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

    //sets the height for every individual box
int box = width/7*6/10;

ImageCell v = null;
if (convertView == null) {
    // If it's not recycled, create a new ImageCell.
    v = new ImageCell (mContext);
    v.setLayoutParams(new GridView.LayoutParams(box, box));
    v.setScaleType(ImageView.ScaleType.CENTER_CROP);
    v.setPadding(0, 0, 0, 0);


} else {
    v = (ImageCell) convertView;
}

v.mCellNumber = position;
v.mGrid = (GridView) mParentView;
v.mEmpty = true;
int id = 200;
v.setId(++id);

String map = str[position];
int pos = position;
int up = pos-10;
int down = pos+10;
int left = pos-1;
int right = pos+1;
if(up>=0){
above = str[up];
}
else{
    //Do nothing
}
if(down<70){
    under = str[down];
    }
else{
    //Do nothing
}
if(left<=-1){
   //Do nothing
}

else{
    lefte=str[left];
}
if(right>=70){
    //Do nothing
 }     
 else{
    righte=str[right];
 }
//if(left>-1|left!=9|left!=19|left!=29|left!=39|left!=49|left!=59){
   // lefte = str[left];
  //  }
 // else{
 //     Log.i("ImageCellAdapter", "Left is trying to break walls "+left);
    //Do nothing
  // }


if (map.equals("mountain")) {
    //Checks surroundings to find out witch drawable to set  
    v.setBackgroundResource(R.color.cell_empty);
     v.mEmpty = false;
     //All
     if(above=="mountain"&&under=="mountain"&&lefte=="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_full);
        }
     //Single
     else if(above=="mountain"&&under!="mountain"&&lefte!="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_down);
        }
     else if(above!="mountain"&&under=="mountain"&&lefte!="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_up);
        }
     else if(above!="mountain"&&under!="mountain"&&lefte!="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_left);
        }
     else if(above!="mountain"&&under!="mountain"&&lefte=="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_right);
        }
     //Double
     else if(above=="mountain"&&under!="mountain"&&lefte!="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_left_down);
        }
     else if(above!="mountain"&&under=="mountain"&&lefte!="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_left_up);
        }
     else if(above=="mountain"&&under!="mountain"&&lefte=="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_right_down);
        }
     else if(above!="mountain"&&under=="mountain"&&lefte=="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_up_right);
        }
     else if(above!="mountain"&&under!="mountain"&&lefte=="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_up_down);
        }
     else if(above=="mountain"&&under=="mountain"&&lefte!="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_up_down);
        }
     //Triple
     else if(above!="mountain"&&under=="mountain"&&lefte=="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_left_right_down);
        }
     else if(above=="mountain"&&under=="mountain"&&lefte=="mountain"&&righte!="mountain"){
            v.setImageResource(R.drawable.mountain_left_up_down);
        }
     else if(above=="mountain"&&under!="mountain"&&lefte=="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_left_up_right);
        }
     else if(above=="mountain"&&under=="mountain"&&lefte!="mountain"&&righte=="mountain"){
            v.setImageResource(R.drawable.mountain_up_right_down);
        }
     //None
        else{
    v.setImageResource(R.drawable.mountain);
        }

}
else if(map=="start"){
    List<String> posOf = Arrays.asList(str);
    startPos=posOf.indexOf("start");
    v.mEmpty=false;
    v.setBackgroundResource(R.color.cell_empty);
    getDur();

     BitmapDrawable first = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.gress);
     BitmapDrawable second =(BitmapDrawable)mContext.getResources().getDrawable(R.drawable.ic_launcher);
     BitmapDrawable third = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.gress);
     BitmapDrawable fourth = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.ic_launcher);

    final AnimationDrawable ani = new AnimationDrawable();       
       ani.addFrame(first, duration);
       ani.addFrame(second, duration);
       ani.addFrame(third, duration);
       ani.addFrame(fourth, duration);
       ani.setOneShot(true);
     v.setImageDrawable(ani);        
       checkIfAnimationDone(ani); 
    v.post(new Runnable() {   
        public void run() {
               ani.start();
                }
        });
}
else if(map=="stop"){
    v.mEmpty=false;
    v.setBackgroundResource(R.color.cell_empty);
    v.setImageResource(R.drawable.ic_launcher);
    v.setTag(1);
}
else if(map=="grass"){
    v.mEmpty=false;
    v.setBackgroundResource(R.drawable.gress);


}
else{
   //    v.setBackgroundResource (R.color.drop_target_enabled);
v.setBackgroundResource (R.color.cell_empty);
}
//v.mGrid.requestDisallowInterceptTouchEvent (true);

//v.setImageResource (R.drawable.hello);

// Set up to relay events to the activity.
// The activity decides which events trigger drag operations.
// Activities like the Android Launcher require a long click to get a drag operation started.


return v;

}

并在GridView中定义onCreate:

代码语言:javascript
复制
gridView= new BoxView(this);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){

              w.getDefaultDisplay().getSize(size);

              Measuredwidth = size.x;
              Measuredheight = size.y; 
            }else{
              Display d = w.getDefaultDisplay(); 
              Measuredwidth = d.getWidth(); 
              Measuredheight = d.getHeight(); 
            }
        int width = Measuredwidth/7*6;

    gridView.setLayoutParams(new GridView.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));
    gridView.setNumColumns(columns);
    gridView.setVerticalSpacing(0);
    gridView.setHorizontalSpacing(0);
    gridView.setPadding(0, 0, 0, 0);
    gridView.setId(101);
    gridView.setSelector(android.R.color.transparent);
    gridView.setAdapter (new ImageCellAdapter(this, MAP));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-19 09:52:34

尝试使用以下标记:

代码语言:javascript
复制
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
票数 2
EN

Stack Overflow用户

发布于 2012-12-05 18:46:28

我注意到你的代码中有一件事:

代码语言:javascript
复制
gridView.setLayoutParams(new GridView.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));

即使GridViewViewGroup,您也不能访问它是LayoutParams。想想看,如果这是可能的话,这意味着您可以在另一个GridView中放置一个GridView

在进一步研究之前,先解决这个问题,因为这会给你带来麻烦。

例如,如果您希望您的GridView位于LinearLayout中,请尝试如下:

代码语言:javascript
复制
gridView.setLayoutParams(new LinearLayout.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));

以下是这个答案的正确实现

代码语言:javascript
复制
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*You have to implement what things from the gridView sould be "saved"*/
        GridView gridView = new GridView(this) {

            @Override
            public Parcelable onSaveInstanceState() {
                // Create the Parceable object with the things you want to save
                                Parceable stateOfGrid = ....etc
                return stateOfGrid;
            }

                        @Override
            public void onRestoreInstanceState(Parcelable state) {
                // Restore your grid's parameters that you previously implemented in onSaveInstanceState
                super.onRestoreInstanceState(state);
                                ...
            }

        };

    }

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

                if (savedInstanceState != null) {
                    Parcelable state = savedInstanceState.getParcelable("state");
                    if (state != null) {
                        gridView.onRestoreInstanceState(state);
                        Log.d(this.getClass().getName(), "state restored!");                
                    }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // Put your grid's Parceable into the bundle
        super.onSaveInstanceState(outState);
                Parcelable state = gridView.onSaveInstanceState();
                outState.putParcelable("state", state);
    }


}
票数 4
EN

Stack Overflow用户

发布于 2012-12-03 18:59:59

您可以使用onSaveInstanceState (Bundle outState)保存网格视图的状态。

代码语言:javascript
复制
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Parcelable state = gridView.onSaveInstanceState();
    outState.putParcelable("state", state);
}

然后在onCreate中,在设置好适配器后,添加以下代码

代码语言:javascript
复制
if (savedInstanceState != null) {
  Parcelable state = savedInstanceState.getParcelable("state");
  if (state != null) {
    gridView.onRestoreInstanceState(state);
    Log.d(this.getClass().getName(), "state restored!");                
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13570176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档