本章節講述Table和ViewPager混合使用以達到滑動頁面的效果。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main" tools:context=".MainActivity"> <!--布局頁面寫入兩個控件TabLayout,ViewPager將兩個控件相結合--> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_below="@id/tab_layout" /></RelativeLayout>2.主函數程序
public class MainActivity extends AppCompatActivity { /*界面的數量和各自界面名稱設置*/ PRivate static final int NUMBER_OF_FRAGMENTS = 4;/*四個部分*/ private static final int FRAGMENT_INDEXT_SETTING = 0;/*配置部分*/ private static final int FRAGMENT_INDEXT_LOGGER = 1;/*數據記錄部分*/ private static final int FRAGMENT_INDEXT_OUTDOORMAP = 2;/*室外地圖顯示部分*/ private static final int FRAGMENT_INDEXT_INDOORMAP = 3;/*室內定位部分*/ /*定義一個包含權限的字符串數組,將需要的權限全部寫到數組中*/ private static final String[] REQUIRED_PERMISSIONS = { Manifest.permission.access_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE }; private static final int LOCATION_REQUEST_ID = 1;/*方法地一個參數,未解決*/ private Fragment[] mFragments;/*用于存放要使用的Fragment*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); requestPermitionAndSetupFragment(this); } /* * 用于選擇使用當前使用哪一個頁面的適配器類 * */ public class ViewPagerAdapter extends FragmentStatePagerAdapter{ /*下面這三個方法是必須要覆寫的*/ /*構造函數*/ public ViewPagerAdapter(FragmentManager fm) { super(fm); } /*獲得頁面的數量*/ @Override public int getCount() { return NUMBER_OF_FRAGMENTS; } /*通過這個方法得到當前頁面的位置*/ @Override public Fragment getItem(int position) { switch(position){ case FRAGMENT_INDEXT_SETTING: return mFragments[FRAGMENT_INDEXT_SETTING];/*返回設置界面*/ case FRAGMENT_INDEXT_LOGGER: return mFragments[FRAGMENT_INDEXT_LOGGER];/*返回記錄數據界面*/ case FRAGMENT_INDEXT_OUTDOORMAP: return mFragments[FRAGMENT_INDEXT_OUTDOORMAP];/*返回室外定位地圖界面*/ case FRAGMENT_INDEXT_INDOORMAP: return mFragments[FRAGMENT_INDEXT_INDOORMAP];/*返回室內定位地圖界面*/ default: throw new IllegalArgumentException("Invalid section: " + position);/*拋出錯誤*/ } } /*獲得標題*/ @Override public CharSequence getPageTitle(int position) { switch(position){ case FRAGMENT_INDEXT_SETTING: return "配置";/*返回設置界面*/ case FRAGMENT_INDEXT_LOGGER: return "數據記錄";/*返回記錄數據界面*/ case FRAGMENT_INDEXT_OUTDOORMAP: return "室外定位";/*返回室外定位地圖界面*/ case FRAGMENT_INDEXT_INDOORMAP: return "室內定位";/*返回室內定位地圖界面*/ default: throw new IllegalArgumentException("Invalid section: " + position);/*拋出錯誤*/ } } } /* * 啟動Fragment * */ private void setupFragment(){ mFragments = new Fragment[NUMBER_OF_FRAGMENTS];/*設置Fragment的數量*/ /*SettingFragment設置*/ SettingFragment settingFragment = new SettingFragment(); mFragments[FRAGMENT_INDEXT_SETTING] = settingFragment; /* * 以下設置使用到的Fragment * */ /*LoggerFragment設置*/ LoggerFragment loggerFragment = new LoggerFragment(); mFragments[FRAGMENT_INDEXT_LOGGER] = loggerFragment; /*OutdoorMapFragment設置*/ OutdoorMapFragment outdoorMapFragment = new OutdoorMapFragment(); mFragments[FRAGMENT_INDEXT_OUTDOORMAP] = outdoorMapFragment; /*IndoorMapFragment設置*/ IndoorMapFragment indoorMapFragment = new IndoorMapFragment(); mFragments[FRAGMENT_INDEXT_INDOORMAP] = indoorMapFragment; ViewPager viewPager = (ViewPager)findViewById(R.id.pager);/*創建ViewPager對象*/ viewPager.setOffscreenPageLimit(4);/*設置界面的頁數為4*/ ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager());/*通過構造函數構造頁面適配器*/ viewPager.setAdapter(adapter);/*將ViewPager設置一個適配器PagerAdapter*/ TabLayout tabLayout = (TabLayout)findViewById(R.id.tab_layout);/*創建一個TabLayout類的對象*/ tabLayout.setupWithViewPager(viewPager);/*使用ViewPager啟動TabLayout*/ /*一旦TabLayout的位置發生改變就會添加一個TabLayout上的頁面選擇監聽器*/ tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager)); /*無論頁面發生變化或則反卷都會添加一個頁面變化監聽器*/ viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); } /* * 查詢是否具有相應的權限 * */ private Boolean haspermission(Activity activity){ /*如果版本號小于Android6.0,不需要判斷,直接返回真*/ if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){ return true; } /*如果有任何一項權限沒有獲得就返回false*/ for(String p : REQUIRED_PERMISSIONS){ if(ContextCompat.checkSelfPermission(activity,p) != PackageManager.PERMISSION_GRANTED){ return false; } } return true; } /* * 查詢是否具有相應的權限以及啟動Fragment * */ private void requestPermitionAndSetupFragment(final Activity activity){ /*如果獲得所有的權限,就直接啟動Fragment*/ if(hasPermission(activity)){ setupFragment(); }else{ ActivityCompat.requestPermissions(activity, REQUIRED_PERMISSIONS, LOCATION_REQUEST_ID); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}3.結果圖
注意的問題:
這里需要注意的是Fragment和FragmentStatePagerAdapter要導入的包是
import android.app.Fragment;import android.app.FragmentManager;import android.support.v13.app.FragmentStatePagerAdapter;誤將TabLayout寫成TableLayout。
新聞熱點
疑難解答