Halten Sie GridView bei der Wiederaufnahme aus dem Ruhemodus

Ich habe ein Problem mit einem ziemlich großen GridView (ca. 70 Kinder) Das GridView funktioniert gut, wenn ich es auf onCreate oder nach dem Fortsetzen nach dem Drücken der Home-Taste und dann zurückkehren. Aber wenn ich nach dem Rückkehr aus dem Schlafmodus wieder aufleben werde, startet mein BaseAdapter wieder und ruiniert die Änderungen, die ich während der Laufzeit getan habe. Dies macht auch getChildAt () geben eine NullPointerException, wenn ich es nach dem Neustart anrufe.

Wie kann ich es einfach machen, was regelmäßig onPause (Home-Button) auf die GridView, und vermeiden, dass die GridView ausgelöscht wird jedes Mal, wenn ich wieder aus dem Sleep-Modus?

Bearbeiten: Ich habe versucht, ein Wakelock für meine Aktivitätsklasse zu wählen, die den BaseAdpter ohne Glück anruft

2.Edit: Seit ich diese Frage gepostet habe, habe ich mit dem Versuch gespielt, das GridView mit diesem Code in onPause wiederherzustellen:

SparseArray<Parcelable> array = new SparseArray<Parcelable>(); gridView.saveHierarchyState(array); bundle = new Bundle(); bundle.putSparseParcelableArray("state", array); 

Und das in onResume:

  try{ gridView.restoreHierarchyState(bundle.getSparseParcelableArray("state")); } catch(Exception e){ //Most likely first start Log.i("SomeTag", "No GridView state found"); } } 

Die seltsame Sache ist alles, was ich scheint, von einem Ort zum anderen auf den Bildschirm gesprungen zu sein, und es ist immer noch abstürzt, wenn ich versuche zu bekommenChildAt (). Es ist auch nicht, es nach dem Schlafmodus zu bekommen.

  1. Bearbeiten Hier ist der Code von BaseAdapter getView (Hinweis: einige dieser Code ist irrelevant)

Public View getView (int position, View convertView, ViewGroup parent) {

 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; 

}

Und das GridView in onCreate definieren:

 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)); 

4 Solutions collect form web for “Halten Sie GridView bei der Wiederaufnahme aus dem Ruhemodus”

Versuchen Sie es mit diesem Tag:

 android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 

Ich habe eine Sache in dir bemerkt:

 gridView.setLayoutParams(new GridView.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL)); 

Auch wenn GridView eine ViewGroup , können Sie nicht auf die LayoutParams . Denken Sie nur, dass es GridView ist, wenn dies möglich wäre, das heißt, Sie könnten ein GridView in ein anderes GridView .

Fix this, bevor du weiter gehst, weil du dich mit dir verwirrst.

Wenn Sie möchten, dass Ihr GridView in einem LinearLayout liegt, versuchen Sie es bitte:

 gridView.setLayoutParams(new LinearLayout.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL)); 

Hier ist die richtige Umsetzung dieser Antwort :

 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); } } 

Sie können onSaveInstanceState (Bundle outState) verwenden , um den Status Ihrer Gridview zu speichern

 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Parcelable state = gridView.onSaveInstanceState(); outState.putParcelable("state", state); } 

Dann in onCreate, nachdem du den Adapter auf grdiview gelegt hast, füge diesen Code hinzu

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

Ist Ihre Anwendung im Landschaftsmodus ausgeführt?

Wenn ja, dann sollten Sie erwägen, das Tag hinzuzufügen

"android:configChanges="keyboard|keyboardHidden|orientation" für deine Aktivität in Manifest.xml, die das Android-System daran hindert, deine Aktivität zu töten und neu zu starten, wenn du den Bildschirm freigeschaltet hast.

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.