Android编程权威指南(第三版)第十一章课后习题

11.5和11.6的问题放在下面代码里一起解决了。

参考了https://blog.csdn.net/Zou997125136/article/details/79935359https://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));

    }
}
posted @ 2020-03-24 23:38  murielshaw  阅读(119)  评论(0)    收藏  举报