Android编程权威指南(第三版)第十一章课后习题
11.5和11.6的问题放在下面代码里一起解决了。
参考了https://blog.csdn.net/Zou997125136/article/details/79935359和https://blog.csdn.net/qq_36192498/article/details/79502275。
看了网上的一些做法,viewpager总是默认占满整个屏幕。有人提出可以设置viewpager的layout_weight="1"来解决,我还没试。这里用的是LinearLayout和RelativeLayout配合解决的。
11.5 外边距控制:对 ViewPager 设置 android:layout_margin="10dp"。
11.6 加按钮:布局文件里加两个按钮。java文件里,添加按钮及监听,添加ViewPager的addOnPageChangeListener监听,setAdapter也略作改动。
activity_crime_pager.xml 布局的代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_marginBottom="50dp"
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_margin="10dp"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="-50dp"
android:orientation="horizontal">
<Button
android:id="@+id/jump_to_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:text="@string/jump_to_first"/>
<Button
android:id="@+id/jump_to_last"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/jump_to_last" />
</RelativeLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
CrimePagerActivity.java 代码:
package com.murielshaw.criminalintent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import java.util.List;
import java.util.UUID;
public class CrimePagerActivity extends AppCompatActivity {
private static final String EXTRA_CRIME_ID="com.murielshaw.criminalintent.crime_id";
private CrimeLab mCrimeLab;
private ViewPager mViewPager;
private List<Crime> mCrimes;
private Button mJumpToFirst;
private Button mJumpToLast;
public CrimePagerActivity() {
}
public static Intent newIntent(Context packageContext, UUID crimeId){
Intent intent=new Intent(packageContext,CrimePagerActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crimeId);
return intent;
}
@Override
protected void onResume(){
super.onResume();
}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
//创建n个crime
mCrimeLab=CrimeLab.get(this);
mCrimes=mCrimeLab.getCrimes();
//在activity布局中找到viewpager
mViewPager=(ViewPager)findViewById(R.id.activity_crime_pager_view_pager);
//设置按钮,和监听
mJumpToFirst=(Button)findViewById(R.id.jump_to_first);
mJumpToFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(0);
}
});
mJumpToLast=(Button)findViewById(R.id.jump_to_last);
mJumpToLast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(mCrimes.size()-1);
}
});
//增加viewpager页面改变的监听,当某个页被调用时,判断是否是第一页和最后一页,设置相应按钮不可用
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position==0){
mJumpToFirst.setEnabled(false);
}else if(!mJumpToFirst.isEnabled()){
mJumpToFirst.setEnabled(true);
}
if(position==mCrimes.size()-1){
mJumpToLast.setEnabled(false);
}else if(!mJumpToLast.isEnabled()){
mJumpToLast.setEnabled(true);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
FragmentManager fragmentManager=getSupportFragmentManager();//代理,负责与viewpager的对话和协调工作
//设置Adapter
//注意,getItem用来生成新页面,所以不能在这里设置按钮不可用,因为页面处于缓存状态再被调用时,不会运行这个getItem。
//但是,初次建立页面时,addOnPageChangeListener中的onPageSelected好像不会被使用,这是会用到getItem里设置的按钮不可用。
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {//创建这个需要用到fragmentManager,getItem(int)方法返回fragment给这个代理,让fragment完成工作
@NonNull
@Override
public Fragment getItem(int position) {
if(position==0){
mJumpToFirst.setEnabled(false);
}else if(position==mCrimes.size()-1){
mJumpToLast.setEnabled(false);
}
Crime crime=mCrimes.get(position);//根据位置找某个crime
return CrimeFragment.newInstance(crime.getId());//创建某个crime对应的页面
}
@Override
public int getCount() {
return mCrimes.size();
}
});
//获得当前页应该所处的位置,将视图设置为当前页。
// setCurrentItem不能放在setAdapter,放在前面点开详情页总会显示第一页。
//可能因为放在前面的时候,后面setAdapter会重新设置打开初始页面。
UUID crimeId=(UUID)getIntent().getSerializableExtra(EXTRA_CRIME_ID);
mViewPager.setCurrentItem(mCrimeLab.getCrimePos(crimeId));
}
}

浙公网安备 33010602011771号