2014-05-02 28 views
3

一直試圖理解這一天的現在,但只是必須做錯了什麼。我希望能夠恢復ScrollView中的方向更改和視頻活動(信息)後返回的位置。ScrollView savedInstanceState總是@NotNull參數

這裏是我完整的代碼沒有任何的我的999不同的失敗代碼試圖

滾動型機器人:ID = 「@ + ID/mScrollView

package com.miniteve.activity; 

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.graphics.Point; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 
import android.widget.RelativeLayout; 

import com.kaltura.client.enums.KalturaMediaType; 
import com.kaltura.client.types.KalturaBaseEntry; 
import com.kaltura.client.types.KalturaMediaEntry; 
import com.kaltura.client.types.KalturaMediaEntryFilter; 
import com.miniteve.components.GridForLand; 
import com.miniteve.components.GridForPort; 
import com.miniteve.components.ItemGrid; 
import com.miniteve.enums.States; 
import com.miniteve.mediatorActivity.TemplateActivity; 
import com.miniteve.services.Media; 
import com.miniteve.utils.Utils; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Observable; 
import java.util.Observer; 



public class VideoCategory extends TemplateActivity implements Observer { 

    private final DownloadListCatigoriesTask downloadTask; 
    private List<KalturaMediaEntry> listEntries; 
    private List<KalturaMediaEntry> copyEntries; 
    private int categoryId; 
    private String categoryName; 
    private KalturaMediaEntry lastCreatedEntry; 
    private RelativeLayout rl_category; 
    private Activity activity; 
    private LinearLayout ll_base; 
    private RelativeLayout menu; 
    private List<GridForPort> contentPort; 
    private List<GridForLand> contentLand; 
    private int orientation; 
    private boolean listCategoriesIsLoaded = false; 
    private List<ProgressBar> progressBar; 
    private int k = 0; 


    public VideoCategory() { 
     listEntries = new ArrayList<KalturaMediaEntry>(); 
     copyEntries = new ArrayList<KalturaMediaEntry>(); 
     downloadTask = new DownloadListCatigoriesTask(); 
     new HashMap<KalturaMediaEntry, Bitmap>(); 
     lastCreatedEntry = new KalturaMediaEntry(); 

    } 





    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     init(); 
     setContentView(R.layout.category); 
     Configuration c = getResources().getConfiguration(); 
     orientation = c.orientation; 

     setView(); 
     activity = this; 
     extractBundle(); 
     ll_base = (LinearLayout) findViewById(R.id.ll_base); 
     rl_category.setVisibility(View.INVISIBLE); 
     menu.setVisibility(View.INVISIBLE); 




     // check display size to figure out what image resolution will be loaded 
     DisplayMetrics metrics = new DisplayMetrics(); 
     display.getMetrics(metrics); 
     Point size1 = new Point(); 
     display.getRealSize(size1); 

     switch (orientation) { 
      case Configuration.ORIENTATION_PORTRAIT: 
      case Configuration.ORIENTATION_UNDEFINED: 
       downloadTask.execute(); 
       break; 
      case Configuration.ORIENTATION_LANDSCAPE: 
       downloadTask.execute(); 
       break; 
      default: 
       break; 
     } 
    } 








    private void extractBundle() { 
     try { 
      Bundle extras = getIntent().getExtras(); 
      assert extras != null; 
      categoryId = extras.getInt("categoryId"); 
      categoryName = extras.getString("categoryName"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      categoryId = 0; 
      categoryName = ""; 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.category); 
     this.orientation = newConfig.orientation; 
     ll_base = (LinearLayout) findViewById(R.id.ll_base); 

     setView(); 
     if (listCategoriesIsLoaded) { 
      updateData(listEntries); 
     } 
    } 

    private void setView() { 
     rl_category = (RelativeLayout) findViewById(R.id.rl_category); 
     ll_base = (LinearLayout) findViewById(R.id.ll_base); 
     menu = (RelativeLayout) findViewById(R.id.menu); 
    } 


    //Called to process touch screen events. 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       break; 
      case MotionEvent.ACTION_UP: 
       break; 
      case MotionEvent.ACTION_MOVE: 

       break; 
     } 
     return super.dispatchTouchEvent(ev); 
    } 


    public void cats(View view) { 
     // Do something in response to button 
     menu.setVisibility(View.VISIBLE); 
    } 

    public void vehicles(View view) { 
     // Do something in response to button 
     getActivityMediator().showVideoCategory(12); 
    } 

    public void funny(View view) { 
     // Do something in response to button 
     getActivityMediator().showVideoCategory(11); 
    } 

    public void music(View view) { 
     // Do something in response to button 
     getActivityMediator().showVideoCategory(10); 
    } 

    public void animals(View view) { 
     // Do something in response to button1 
     getActivityMediator().showVideoCategory(9); 
    } 


    public void close(View view) { 
     // Do something in response to button 

     menu.setVisibility(View.INVISIBLE); 

    } 


    public void back(View view) { 
     // Do something in response to button 

     getActivityMediator().showMostPopular(); 

    } 


    public void onClick(View v) { 
     switch (v.getId()) { 

      case R.id.iv_thumbnail: 
       getActivityMediator().showInfo(lastCreatedEntry.id, categoryName, lastCreatedEntry.partnerId); 
       break; 

     } 



    } 





    private void ImageLoader() { 

     // check display size to figure out what image resolution will be loaded 
     DisplayMetrics metrics = new DisplayMetrics(); 
     display.getMetrics(metrics); 
     Point size1 = new Point(); 
     display.getRealSize(size1); 


     Log.w(TAG, "Start image loader"); 
     float scale = (float) size1.x/(float) size1.y; 
     DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisc(true).imageScaleType(ImageScaleType.IN_SAMPLE_INT).bitmapConfig(Bitmap.Config.RGB_565).build(); 

     // This configuration tuning is custom. You can tune every option, you may tune some of them, 
     // or you can create default configuration by 
     // ImageLoaderConfiguration.createDefault(this); 
     // method. 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(activity) 
       .threadPoolSize(3).threadPriority(Thread.NORM_PRIORITY - 2).memoryCacheSize(256000000) // 256 Mb 
       .discCacheSize(150000000) // 150 Mb 
       .denyCacheImageMultipleSizesInMemory().defaultDisplayImageOptions(options) 
       .enableLogging().build(); 
     // Initialize ImageLoader with configuration. 
     ImageLoader.getInstance().init(config); 
     imageLoader.init(config); 


     final List<String> url = new ArrayList<String>(); 
     List<ImageView> view = new ArrayList<ImageView>(); 
     progressBar = new ArrayList<ProgressBar>(); 

     for (KalturaMediaEntry entry : copyEntries) { 
      url.add(entry.thumbnailUrl + "/width/738/height/404"); 
     } 
     int count = 0; 
     for (String string : url) { 
      Log.w(TAG, "url: " + count++ + " " + string); 
     } 

     int state = 0; 
     count = 0; 
     for (KalturaMediaEntry copyEntry : copyEntries) { 
      ItemGrid ig = null; 
      switch (orientation) { 

       case Configuration.ORIENTATION_PORTRAIT: 
        switch (state) { 
         case 0: 
          //left 
          Log.w(TAG, "xl: " + count); 
          ig = contentPort.get(count).getLeftItemGrid(); 
          state = 2; 
          break; 
         case 2: 
          //right 
          Log.w(TAG, "xr: " + count); 
          ig = contentPort.get(count).getRightItemGrid(); 
          count++; 
          state = 0; 
          break; 
        } 
        break; 

       case Configuration.ORIENTATION_LANDSCAPE: 
        switch (state) { 
         case 0: 
          //left 
          Log.w(TAG, "xl: " + count); 
          ig = contentLand.get(count).getLeftItemGrid(); 
          state = 1; 
          break; 
         case 1: 
          //center 
          Log.w(TAG, "xc: " + count); 
          ig = contentLand.get(count).getCenterItemGrid(); 
          state = 2; 
          break; 
         case 2: 
          //right 
          Log.w(TAG, "xr: " + count); 
          ig = contentLand.get(count).getRightItemGrid(); 
          count++; 
          state = 0; 
          break; 
        } 
        break; 
       default: 
        break; 
      } 
      if (ig != null) { 
       view.add(ig.getThumb()); 
       progressBar.add(ig.getProgressBar()); 
      } 
     } 

     count = 0; 
     Log.w(TAG, "size: " + progressBar.size()); 
     k = 0; 
     for (String string : url) { 
      if (string != null) { 
       imageLoader.displayImage(string, view.get(count), new ImageLoadingListener() { 

        @Override 
        public void onLoadingStarted(String imageUri, View view) { 
         // do nothing 
         Log.w(TAG, "onLoadingStarted"); 

        } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, 
               FailReason failReason) { 
         Log.w(TAG, "onLoadingFailed"); 
         imageLoader.clearMemoryCache(); 
         imageLoader.clearDiscCache(); 

        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, 
                Bitmap loadedImage) { 
         // do nothing 

         if (k < progressBar.size()) { 

          progressBar.get(k++).setVisibility(View.GONE); 

         } 

         Log.w(TAG, "onLoadingComplete: " + k); 

         Log.w(TAG, "k<>size: " + k + "--" + url.size()); 
         if (k >= url.size()) { 
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
         } 

        } 

        @Override 
        public void onLoadingCancelled(String imageUri, View view) { 
         // TODO Auto-generated method stub 

        } 
       }); 
       count++; 
      } 


     } 

    } 

    private void updateData(List<KalturaMediaEntry> listEntries) { 
     copyEntries = new ArrayList<KalturaMediaEntry>(); 
     copyEntries.addAll(listEntries); 

     if (copyEntries.size() > 0) { 
      int sizeListentry = copyEntries.size(); 

      lastCreatedEntry = copyEntries.get(copyEntries.size() - 1); 
      copyEntries.remove(lastCreatedEntry); 

     } 

     switch (orientation) { 

      case Configuration.ORIENTATION_PORTRAIT: 
       Log.w(TAG, "start in port"); 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
       createGridForPort(); 
       if (listEntries.size() > 0) { 
        ImageLoader(); 
       } 
       break; 

      case Configuration.ORIENTATION_LANDSCAPE: 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
       if (listEntries.size() > 1) { 

        createGridForLand(); 
        Log.w(TAG, "start in land"); 
        if (listEntries.size() > 0) { 
         ImageLoader(); 
        } 


        break; 

       } 
     } 
    } 

    private void processItem(ItemGrid ig, int index, int width, int height) { 
     ig.getThumb().getLayoutParams().width = width; 
     ig.getThumb().getLayoutParams().height = height; 
     ig.getThumb().setScaleType(ImageView.ScaleType.CENTER_CROP); 
     ig.setKey(copyEntries.get(index)); 
    } 

    private void processNoElement(ItemGrid ig) { 
     ig.getThumb().setVisibility(View.VISIBLE); 
     ig.getProgressBar().setVisibility(View.INVISIBLE); 

    } 

    private void addThumbListener(ItemGrid ig, final int index) { 
     ig.getThumb().setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       if (index < copyEntries.size()) { 
        KalturaBaseEntry ent = copyEntries.get(index); 
        getActivityMediator().showInfo(ent.id, "Most Popular", ent.partnerId); 
        Log.w(TAG, "click first" + index); 
       } 
      } 
     }); 
    } 

    //TODO Fixa portrait grid 
    private void createGridForPort() { 
     Log.w(TAG, "grid for port"); 

     if (copyEntries.size() > 0) { 
      contentPort = new ArrayList<GridForPort>(); 
      Log.w(TAG, "size: " + copyEntries.size()); 
      int countConent = copyEntries.size()/2; 
      Log.w(TAG, "countConent: " + countConent); 
      int rest = copyEntries.size() % 2; 
      Log.w(TAG, "rest: " + rest); 

      if (rest != 0) { 
       countConent = countConent + 1; 
       Log.w(TAG, "countConent: " + countConent); 
      } 

      //Create countContent contents 
      int offset = 0; 
      int size = copyEntries.size(); 

      if (size > 2) { 
       Log.w(TAG, "1 offset: " + offset); 
       contentPort.add(new GridForPort(TAG, this, offset)); 
       size = size - 2; 
       for (int i = 0; i < countConent - 1; i++) { 
        offset = offset + 2; 
        size = size - 2; 
        Log.w(TAG, "3 offset: " + offset); 
        contentPort.add(new GridForPort(TAG, this, offset)); 
       } 

      } else { 
       Log.w(TAG, "2 offset: " + 0); 
       contentPort.add(new GridForPort(TAG, this, 0)); 
      } 

      // check display size to figure out what image resolution will be loaded 
      DisplayMetrics metrics = new DisplayMetrics(); 
      display.getMetrics(metrics); 
      Point size1 = new Point(); 
      display.getRealSize(size1); 

      int width = size1.x; 
      int height = size1.y; 


      float scale = (float) size1.x/(float) size1.y; 
      //set params 
      for (final GridForPort templateContent : contentPort) { 
       ll_base.addView(templateContent.getRowGrid()); 

       if (templateContent.getOffset() < copyEntries.size()) { 
        processItem(templateContent.getLeftItemGrid(), templateContent.getOffset(), size1.x/2, size1.x/2); 
       } else { 
        Log.w(TAG, "no left element"); 
       } 
       if (templateContent.getOffset() + 1 < copyEntries.size()) { 
        processItem(templateContent.getRightItemGrid(), templateContent.getOffset() + 1, size1.x/2, size1.x/2); 
       } else { 
        Log.w(TAG, "no right element"); 
        processNoElement(templateContent.getRightItemGrid()); 
       } 

       addThumbListener(templateContent.getLeftItemGrid(), templateContent.getOffset()); 
       addThumbListener(templateContent.getRightItemGrid(), templateContent.getOffset() + 1); 
      } 
     } else { 
      Log.w(TAG, "list size is 0"); 
     } 
    } 

    private void createGridForLand() { 
     Log.w(TAG, "grid for land"); 

     if (copyEntries.size() > 0) { 
      contentLand = new ArrayList<GridForLand>(); 
      Log.w(TAG, "size: " + copyEntries.size()); 
      int countConent = copyEntries.size()/3; 
      Log.w(TAG, "countConent: " + countConent); 
      int rest = copyEntries.size() % 3; 
      Log.w(TAG, "rest: " + rest); 

      if (rest != 0) { 
       countConent = countConent + 1; 
       Log.w(TAG, "countConent: " + countConent); 
      } 

      //Create countContent contents 
      int offset = 0; 
      int size = copyEntries.size(); 

      if (size > 1) { 
       Log.w(TAG, "1 offset: " + offset); 
       contentLand.add(new GridForLand(TAG, this, offset)); 
       size = size - 3; 
       for (int i = 0; i < countConent - 1; i++) { 
        offset = offset + 3; 
        size = size - 3; 
        Log.w(TAG, "3 offset: " + offset); 
        contentLand.add(new GridForLand(TAG, this, offset)); 
       } 
      } else { 
       Log.w(TAG, "2 offset: " + 0); 
       contentLand.add(new GridForLand(TAG, this, 0)); 
      } 

      // check display size to figure out what image resolution will be loaded 
      DisplayMetrics metrics = new DisplayMetrics(); 
      display.getMetrics(metrics); 
      Point size1 = new Point(); 
      display.getRealSize(size1); 

      float scale = (float) size1.x/(float) size1.y; 
      //set params 
      for (final GridForLand templateContent : contentLand) { 

       ll_base.addView(templateContent.getRowGrid()); 

       if (templateContent.getOffset() < copyEntries.size()) { 
        processItem(templateContent.getLeftItemGrid(), templateContent.getOffset(), size1.x/3, size1.x/3); 


       } else { 
        Log.w(TAG, "no left element"); 
       } 

       if (templateContent.getOffset() + 1 < copyEntries.size()) { 
        processItem(templateContent.getCenterItemGrid(), templateContent.getOffset() + 1, size1.x/3, size1.x/3); 
       } else { 
        Log.w(TAG, "no center element"); 
        processNoElement(templateContent.getCenterItemGrid()); 
       } 

       if (templateContent.getOffset() + 2 < copyEntries.size()) { 
        processItem(templateContent.getRightItemGrid(), templateContent.getOffset() + 2, size1.x/3, size1.x/3); 

       } else { 
        Log.w(TAG, "no right element"); 
        processNoElement(templateContent.getRightItemGrid()); 
       } 

       addThumbListener(templateContent.getLeftItemGrid(), templateContent.getOffset()); 
       addThumbListener(templateContent.getCenterItemGrid(), templateContent.getOffset() + 1); 
       addThumbListener(templateContent.getRightItemGrid(), templateContent.getOffset() + 2); 

      } 
     } else { 
      Log.w(TAG, "list size is 0"); 
     } 
    } 

    @Override 
    public void update(Observable paramObservable, Object paramObject) { 
     updateData((List<KalturaMediaEntry>) paramObject); 
    } 


    private class DownloadListCatigoriesTask extends AsyncTask<Void, States, List<KalturaMediaEntry>> { 

     private String message; 

     @Override 
     protected List<KalturaMediaEntry> doInBackground(Void... params) { 
      // Test for connection 
      try { 
       if (Utils.checkInternetConnection(getApplicationContext())) { 
        /** 
        * Getting list of all entries category 
        */ 
        publishProgress(States.LOADING_DATA); 
        /** 
        * Getting list of all entries category 
        */ 
        KalturaMediaEntryFilter filter = new KalturaMediaEntryFilter(); 
        filter.mediaTypeEqual = KalturaMediaType.VIDEO; 
        filter.categoriesIdsMatchAnd = Integer.toString(categoryId); 
        listEntries = Media.listAllEntriesByIdCategories(TAG, filter, 1, Media.ENTRIES_MAX_COUNT); 
       } 
       listCategoriesIsLoaded = true; 
       Log.w(TAG, "thread is end"); 
      } catch (Exception e) { 
       message = Utils.handleException(TAG, e); 
       publishProgress(States.NO_CONNECTION); 
      } 
      return listEntries; 
     } 

     @Override 
     protected void onPostExecute(List<KalturaMediaEntry> listCategory) { 
      progressDialog.hide(); 
      if (listEntries.size() != 0) { 

       updateData(listEntries); 
      } 
     } 


    } 
} 

編輯 什麼我試圖投入是這樣的東西

protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putIntArray("ARTICLE_SCROLL_POSITION", 
      new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()}); 
} 

protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    final int[] position = savedInstanceState.getIntArray("ARTICLE_SCROLL_POSITION"); 
    if(position != null) 
     mScrollView.post(new Runnable() { 
      public void run() { 
       mScrollView.scrollTo(position[0], position[1]); 
      } 
     }); 
} 

也嘗試我的其他變種,把它畫上畫。

+1

意外的JavaScript標記? – CupawnTae

回答

0

我在這裏想到的是,您正試圖在ScrollView由佈局定位之前設置滾動位置,所以它的大小爲0,並且設置滾動到任何值都沒有任何影響。嘗試恢復狀態OnPreDrawListener

private static final String ARTICLE_SCROLL_POSITION = "ARTICLE_SCROLL_POSITION"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //... your stuff here 

    if (savedInstanceState != null) { 
     mScrollView.getViewTreeObserver().setOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       mScrollView.getViewTreeObserver().removeOnPreDrawListener(this); 
       mScrollView.setScrollY(savedInstanceState.getInt(ARTICLE_SCROLL_POSITION)); 
      } 
     }); 
    } 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //I don't think scroll x is ever being non-zero here 
    outState.putInt(ARTICLE_SCROLL_POSITION, mScrollView.getScrollY()); 
}