簡體   English   中英

如何通過屏幕旋轉存儲分頁器視圖的狀態

[英]how to store state of pager view with screen rotation

我想為具有尋呼機視圖的活動添加屏幕旋轉支持。 我想要的是當用戶更改屏幕方向時,應以新方向打開已打開的尋呼機視圖的選項卡。 但現在活動會重新啟動,並且每次第一個標簽打開。 請幫我。 提前致謝。

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

處理屏幕更改和/或旋轉的另一種方法是將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文檔

每當旋轉屏幕時,活動都會被完全破壞並重新創建。 為了解決這個問題,有一個稱為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 -如果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/components/activities/activity-lifecycle.html#saras

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM