Intereting Posts
Android – Получить контакт Фото с телефона Android adjustResize – Как отключить эффект затухания Третье действие называется возвратом его результата в первую активность вместо отправки результата во второе действие? Как решить «Код версии вашего APK должен быть выше 2.» в консоли разработчика Google Play? Запросить SQLiteDatabase для Android с помощью Regex Android-соединение с Twitter – получите пустой ответ от twitter Проблема с Eclipse для Android Не удалось создать класс BuildConfig Как получить API Kakaotalk для Android? Конфликт с зависимостью «com.android.support:support-annotations». Разрешенные версии для приложения (23.1.0) и тестового приложения (23.0.1) отличаются Как перенаправить файлы на экземпляр эмулятора, используя студию Android Моно для макросов препроцессора Android PageCurl анимации на переходах ViewPager? Flip-Animation для изменения активности Как передать переменную String в MultipartEntity? Создайте боковую панель, например браузер Dolphin или Firefox в Android

Хранить GridView при возобновлении сна

У меня возникла проблема с довольно большим GridView (около 70 детей). GridView отлично работает, если я запускаю его onCreate или после возобновления после нажатия кнопки home, а затем возвращается. Но когда я возвращаюсь после выхода из режима сна, мой BaseAdapter снова запускается и разрушает изменения, которые я сделал с ним во время выполнения. Это также заставляет getChildAt () давать исключение NullPointerException, если я вызываю его сразу после перезапуска.

Как я могу заставить его просто делать то, что регулярное onPause (домашняя кнопка) делает с GridView, и избегать того, что GridView уничтожается каждый раз, когда я возвращаюсь из спящего режима?

Изменить: я попытался установить wakelock для моего класса Activity, который вызывает BaseAdpter без везения

2.Edit: Поскольку я разместил этот вопрос, я играл с попыткой восстановить GridView с помощью этого кода в onPause:

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

И это в onResume:

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

Странная вещь – все, что я, кажется, прыгнул с одного места на другое на экране, и он все еще падает, когда я пытаюсь getChildAt (). Это также не удается получить после спящего режима.

  1. Редактировать Вот код из BaseAdapter getView (обратите внимание: некоторые из этого кода не имеют значения)

Public View getView (int position, View convertView, родительская группа ViewGroup) {

 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:

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

Solutions Collecting From Web of "Хранить GridView при возобновлении сна"

Попробуйте использовать этот тег:

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

Я заметил одну вещь в вашем коде:

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

Даже если GridView является ViewGroup , вы не можете получить доступ к его LayoutParams . Просто подумайте, что это произойдет, если это будет возможно, это означает, что вы можете поместить GridView внутри другого GridView .

Исправьте это, прежде чем идти дальше, потому что возится с вами.

Если вы хотите, чтобы ваш GridView находился внутри LinearLayout, попробуйте это:

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

Вот правильная реализация этого ответа :

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

Вы можете использовать onSaveInstanceState (Bundle outState), чтобы сохранить состояние вашего gridview

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

Затем в onCreate после того, как вы установили адаптер для grdiview, добавьте этот код

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

Работает ли ваше приложение в ландшафтном режиме?

Если да, то вам следует рассмотреть возможность добавления тега

"android:configChanges="keyboard|keyboardHidden|orientation" для вашей деятельности в Manifest.xml, что предотвратит убийство вашей системы Android и перезапуск ее при разблокировке экрана.