Android编程权威指南(第三版)第十一章:章节梳理、挑战练习

    科技2022-07-10  115

    本章介绍了ViewPager,所谓ViewPager,如下图: 实际实现ViewPager的过程非常简单,就是将Fragment 托管给一个Activity的布局文件,且该布局文件中的组件就是ViewPager。在本例中,就是将CrimePagerActivity替换了之前的CrimeActivity,并创建相应的activity_crime_pager.xml

    在CrimePagerActivity中,我们所需要做的主要任务就是将model层的数据托管给ViewPager。这部分的代码是由mViewPager.setAdapter完成的。 考虑到,在Crimlist中点击数据,再将数据传导给CrimePagerActivity。所以要考虑到数据再CrimePagerActivity中的流转

    public class CrimePagerActivity extends AppCompatActivity { private static final String EXTRA_CRIME_ID= "com..........crime_id"; private ViewPager mViewPager; private List<Crmie> mCrimes; public static Intent newIntent(Context packageContext,UUID crimeId){ Intent intent= new Intent(packageContext,CrimePagerActivity.class); intent.putExtra(EXTRA_CRIME_ID,crimeId); return intent; }//公共方法,以便给其它类调用传值。(在CrimeListFragment) @Override protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.activity_crime_pager); UUID crimeId = (UUID) getIntent() .getSerializableExtra(EXTRA_CRIME_ID); //获取值 mViewPager=(ViewPager)findViewById(R.id.crime_view_pager); mCrimes = CrimeLab.get(this).getCrimes(); FragmentManager fragmentManager = getSupportFragmentManager(); mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager){ @Override public Fragment getItem(int position){ Crime crime=mCrimes.get(positon); return CrimeFragment.newInstance(crime.getId()); //注意这里返回的CrimeFragment,是调用了CrimeFragment.newInstance。 //这里有传值操作需要注意。 } @Override public int getCount(){ return mCrimes.size(); }); } for(int i=0;i<mCrimes.size();i++){ if(mCrimes.get(i).getId().equals(crimeId)){ mViewPager.setCurrentItem(i); break; } } } }

    这里要特别注意,这里是ViewPager中的Adapter 启用了CrimeFragment,是在getItem中去启动CrimeFragment,而ViewPager默认于第一个值,所以想要CrimeLsit中所点击的项显示在接下来的页面,就需要以上的代码中的for循环。

    挑战练习: 第一题主要由于ViewPage默认无边距,需要设置一下边距

    mViewPager.setPageMargin((int) getResources().getDimensionPixelOffset(//设置编剧代码

    第二题是本章节的重点,需要从两个方面考虑,一个是需要重现布局文件,再一个是对Activity进行编码。 布局文件: 需要更改activity_crime_pager.xml

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.viewpager.widget.ViewPager android:id="@+id/activity_crime_pager_view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" /> <FrameLayout android:layout_width="match_parent" android:layout_height="52dp" android:layout_gravity="bottom"> <Button android:id="@+id/Button_JumpToFirst" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left|bottom" android:text="FirstPage" /> <Button android:id="@+id/Button_JumpToLast" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:text="LastPage" /> </FrameLayout> </FrameLayout>

    这里要注意一点,我是使用了FrameLaout布局。如果使用LinearLayout布局,ViewPage会自动占满整个屏幕,需要设置layout_weight权重来保证布局完整。 Activity的编写: 1.Button监听器设置:

    mJumpFirstButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mViewPager.setCurrentItem(0); } }); mJumpLastButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mViewPager.setCurrentItem(mCrimes.size()-1); } });

    2.Page监听器设置

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position==0) mJumpFirstButton.setEnabled(false); else if(position==mCrimes.size()-1) mJumpLastButton.setEnabled(false); else mJumpFirstButton.setEnabled(true); mJumpLastButton.setEnabled(true); } @Override public void onPageScrollStateChanged(int state) { } });

    3.初始页面,按钮初始化

    for ( int i =0;i<mCrimes.size();i++){ if (mCrimes.get(i).getId().equals(crimeId)){ mViewPager.setCurrentItem(i); if (i==0) mJumpFirstButton.setEnabled(false); if(i==mCrimes.size()-1) mJumpLastButton.setEnabled(false); break; } }

    Page会自动默认加载初始项,所以需要对第一个页面和最后一个页面进行初始化。

    Processed: 0.012, SQL: 11