【问题标题】:How to save a variable value when starting another activity开始另一个活动时如何保存变量值
【发布时间】:2016-10-14 23:13:03
【问题描述】:

我在应用程序中的一个活动(活动 A)显示了一个视频列表,如图所示:

视频存储在名为 videosList 的 ArrayList 中,当用户选择视频时,视频将使用另一个活动 B 中的嵌入式 YouTube 播放器播放。 问题是当用户从活动 B(带有视频播放器的活动)返回到活动 A(带有视频列表的活动)时,变量 videosList 为空,因此应用程序停止运行并出现错误。

我试图实现

protected void onSaveInstanceState(Bundle savedInstanceState) protected void onRestoreInstanceState(Bundle savedInstanceState) 方法来保存活动状态和一些变量,因此当用户返回活动 A 时,应用程序可以再次显示视频列表,但是当我尝试获取之前保存的值时在onSaveInstanceState(Bundle savedInstanceState)public void onCreate(Bundle savedInstanceState)savedInstanceState 始终为NULL。

这是我的代码:

 public class VideosCatalogActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {



    private Toolbar toolbar;
    private GridView videosGrid;
    private ArrayList<VideoEntity> videosList;

    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private FirebaseDatabase database;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        Log.d(TAG, " onCreate(Bundle) - Ini ");
        super.onCreate(savedInstanceState);
        //  onSaveInstanceState();

        setContentView(R.layout.videos_catalog_layout);
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        toolbar.setTitle(R.string.app_name);
        toolbar.setTitleTextColor(getResources().getColor(R.color.com_facebook_button_background_color_focused));
        mAuth = FirebaseAuth.getInstance();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                FirebaseUser user = mAuth.getCurrentUser();

            }
        };

        database = FirebaseDatabase.getInstance();
        Bundle bundle = getIntent().getExtras();

        String actividad = bundle.getString("Activity");

        if (actividad.equals("DocumentariesCategoriesActivity")) {


            videosList = bundle.getParcelableArrayList("com.app.example.VideoEntity");


updateCatalog();

            /*

            String videoId = "";


            if (!videosList.isEmpty() && !videosList.equals(null)) {

                for (VideoEntity video : videosList) {
                    DatabaseReference mRef = database.getReference().child("Videos").child(video.getId());
                    mRef.setValue(video);
                }


                videosGrid = (GridView) findViewById(R.id.videosGrid);
                MyGridViewAdapter adapter = new MyGridViewAdapter(this);
                adapter.setVideosList(videosList);
                videosGrid.setAdapter(adapter);
                videosGrid.setOnItemClickListener(this);
            } */

        }


        Log.d(TAG, " onCreate(Bundle) - Fi ");
    }






    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        Log.d(TAG, "onCreateOptionsMenu(Menu) - Ini");

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);

        Log.d(TAG, "onCreateOptionsMenu(Menu) - Fi");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {

        Log.d(TAG, "onOptionItemSelected(MenuItem) - Ini");

        switch (menuItem.getItemId()) {

            case R.id.action_logout:
                updateActivity(mAuth.getCurrentUser());

        }

        Log.d(TAG, "onOptionItemSelected(MenuItem) - Fi");
        return true;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Ini ");

        Intent intent = new Intent(getApplicationContext(), YoutubePlayerActivity.class);
        intent.putExtra("VIDEO_ID", videosList.get(position).getId());

        startActivity(intent);

        Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Fi ");

    }

    protected void updateActivity(FirebaseUser user) {
        Log.d(TAG, "updateActivity(FirebaseUser) - Ini");

        mAuth.signOut();
        Intent i = new Intent(VideosCatalogActivity.this, LoginActivity.class);
        startActivity(i);


        Log.d(TAG, "updateActivity(FirebaseUser) - Fi");
    }

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onSaveInstanceState(Bundle) - Ini");
        super.onSaveInstanceState(savedInstanceState);

        savedInstanceState.putParcelableArrayList("VIDEOS_LIST", videosList);
        savedInstanceState.putAll(savedInstanceState);

        Log.d(TAG, "onSaveInstanceState(Bundle) - Fi");
        Log.i("","onSaveInstance is executed");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onRestoreInstanceState(Bundle) - Ini");
        super.onRestoreInstanceState(savedInstanceState);

        videosList = savedInstanceState.getParcelableArrayList("VIDEOS_LIST");
        updateCatalog();

        Log.i("","onRestoreInstance is executed");
        Log.d(TAG, "onRestoreInstanceState(Bundle) - Fi");
    }

    protected void updateCatalog() {

        Log.d(TAG, "updateCatalog() - Ini");

        String videoId = "";

        for (VideoEntity video : videosList) {
            DatabaseReference mRef = database.getReference().child("Videos").child(video.getId());
            mRef.setValue(video);
        }

        videosGrid = (GridView) findViewById(R.id.videosGrid);
        MyGridViewAdapter adapter = new MyGridViewAdapter(this);
        adapter.setVideosList(videosList);
        videosGrid.setAdapter(adapter);
        videosGrid.setOnItemClickListener(this);



        Log.d(TAG, "updateCatalog() - Fi");

    }


}

请问我该如何解决这个问题?

【问题讨论】:

  • 确保 VideoEntityParcelable 类。

标签: android android-activity savestate


【解决方案1】:

为什么不使用 SingletonData 类?它存储 ArrayList,当您需要重新加载 ArrayList 时,您可以从 Singleton 加载它。

public class DataSingleton {

    private static DataSingleton instance = new DataSingleton();
    private DataSingleton(){    }

    public static DataSingleton getInstance(){  return instance;    }
    public static void setIntances(DataSingleton instance){DataSingleton.instance = instance;}

    private ArrayList<Videos> videosList;


    public void setArrayVideos(ArrayList<Videos> videos){
        videosList=videos;
    }

    public ArrayList<Videos> getArrayVideos(){
        return videosList;
    }
}

然后您在活动 A 中调用该类并将 ArrayList 设置在您想要的任何位置。

DataSingleton.getInstance().setArrayVideos(videosList);   
videosList= DataSingleton.getInstance().getArrayVideos();

【讨论】:

    【解决方案2】:

    你的 onSaveInstanceState 实现必须是这样的

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onSaveInstanceState(Bundle) - Ini");
        if(savedInstanceState == null)
        {
            savedInstanceState = new Bundle();
        }        
        savedInstanceState.putParcelableArrayList("VIDEOS_LIST", videosList);
    
        Log.d(TAG, "onSaveInstanceState(Bundle) - Fi");
        Log.i("","onSaveInstance is executed");
    
        super.onSaveInstanceState(savedInstanceState);
    }
    

    【讨论】:

    • 它不起作用,当我从 Activity B 回到 Activity A 时,savedInstanceState 为 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多