如何使用屏幕旋转来存储Pager视图的状态



我想将屏幕旋转支持添加到具有Pager视图的活动中。我想要的是,当用户更改屏幕方向时,应在新的方向上打开打开的Pager视图选项卡。但是现在活动重新启动,每次首次选项卡都打开。请帮助我。预先感谢。

package com.example.ali.namallibrary;
import android.app.Fragment;
import android.content.Context;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.Serializable;
public class aboutLibrary extends AppCompatActivity {
CustomAdapter customAdapterpter = null;
TabLayout tabLayout;
ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_about_library);
    customAdapterpter  = new CustomAdapter(getSupportFragmentManager(),getApplicationContext());
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    viewPager.setAdapter(customAdapterpter);
    tabLayout = (TabLayout) findViewById(R.id.tabBar);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener()   {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
    });
} // end of oncreate
private class CustomAdapter extends FragmentPagerAdapter {
    private String[] fragmentNames = {"About","Collection","Timing","Contact"};
    public CustomAdapter(FragmentManager supportFragmentManager, Context applicationContext) {
        super(supportFragmentManager);
    }
    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        switch (position)
        {
            case 0 :
                return new aboutLibraryFrag();
            case 1 :
                return new libraryCollectionFrag();
            case 2 :
                return new libraryTimingFrag();
            case 3 :
                return new contactUsFrag();
            default:
                return null;
        }
    }
    @Override
    public int getCount() {
        return fragmentNames.length;
    }
    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentNames[position];
    }
}

每当您旋转屏幕时,活动就会完全破坏并重新创建。为了解决这个问题,有一种名为onSaveInstanceState的生命周期方法。在此方法中,您可以保存Bundle对象。Bundle是您定义的一堆钥匙值对,旋转后您想要的。在该捆绑包中,您可以存储视图寻呼机的当前位置。我与ViewPagers合作不多,但是GetCurrentItem可能是您想要的。您需要使您的ViewPager成为成员变量,并且是键的常数。然后我猜它看起来像:

public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(CURRENT_POSITION_KEY, mViewPager.getCurrentItem());
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

onCreate方法采用Bundle savedInstanceState-如果活动是从旋转重新启动的,则此参数将使您保存在onSaveInstanceState中的所有内容。因此,您可以在onCreate中执行这样的操作:

// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
 int currentPos = savedInstanceState.getInt(CURRENT_POSITION_KEY);
 mViewPager.setCurrentItem(currentPos)
}

可以在此处找到有关加载和保存状态的更多信息:https://developer.android.com/guide/guide/components/components/activities/activity-lifecycle.html#saras

处理屏幕更改或旋转的另一种方法是将android:configChanges添加到您的活动中:

<activity android:name="com.example.myactivity" 
          android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" />

提到的configchanges不会导致您的活动在发生时被取消和重新创建,Android只需旋转屏幕,然后致电onConfigurationChanged,然后您可以自己手动处理案例。

您可以在活动中覆盖onConfigurationChanged来处理事件。

public class myactivity extends Activity
{
    //..
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }
}

在此处的Android文档中阅读更多信息

最新更新