ScrollView savedInstanceState 参数始终为 @NotNull 的问题

3

我已经尽力理解了这个问题好几天,但是可能做错了什么。我想在屏幕方向改变和从视频活动(info)返回后能够恢复ScrollView的位置。

以下是我的完整代码,没有我的999个错误代码尝试:

ScrollView android: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
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接