《安卓编程权威指南》第十一章 挑战练习

第一个挑战:恢复CrimeFragment的边距

1、既然要设边距,那我们就先增加一个边距

    在res>>values里新建一个dimen.xml,在里面设置间距内容如下:


    50.0dip

2、然后在CrimePagerActivity.Java里新加一段代码

protected void onCreate(Bundle savedInstanceState) {
        //实例化ViewPager组件
        mViewPager=(ViewPager)findViewById(R.id.crime_view_pager);
        ...
        //ViewPager默认情况下无边距,通过下面方法设置
        mViewPager.setPageMargin((int) getResources().getDimensionPixelOffset(R.dimen.pager_margin));
    }

第二个挑战:添加 jump to First 按钮和  jump to Last 按钮

我一开始的想法很简单,因为要控制按钮能不能点击,所以应该就是在fragment_crime.xml添加按钮
   
然后直接在CrimeLab这个单例类里新增头尾两个变量
public class CrimeLab {
    private UUID firstId;
    private UUID lastId;

    /*private说明其他类不能构造自己*/
    private CrimeLab(Context context){
        mCrimes=new ArrayList<>();
        //存入100个Crime对象
        for (int i=0;i<100;i++){
            ...
            if (i==0){
                firstId=crime.getId();
            }
            if (i==99){
                lastId=crime.getId();
            }
        }
    }
    public UUID getFirstId() {
        return firstId;
    }

    public UUID getLastId() {
        return lastId;
    }
}

在显示部件的fragment增加两个按钮点击事件

public class CrimeFragment extends Fragment {
    private Button jumpToFirst;
    private Button jumpToLast;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_crime,container,false);//生成视图
        ...
        jumpToFirst=(Button)view.findViewById(R.id.jump_to_first);
        if (mCrime.getId().equals(CrimeLab.get(getActivity()).getFirstId())){
            jumpToFirst.setEnabled(false);
        }
        jumpToFirst.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("crime","jump to first");
                Intent intent=CrimePagerActivity.newIntent(getActivity(),CrimeLab.get(getActivity()).getFirstId());
                startActivity(intent);
            }
        });

        jumpToLast=(Button)view.findViewById(R.id.jump_to_last);
        if (mCrime.getId().equals(CrimeLab.get(getActivity()).getLastId())){
            jumpToLast.setEnabled(false);
        }
        jumpToLast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("crime","jump to last");
                Intent intent=CrimePagerActivity.newIntent(getActivity(),CrimeLab.get(getActivity()).getLastId());
                startActivity(intent);
//                FragmentManager fragmentManager=getFragmentManager();
//                FragmentTransaction transaction=fragmentManager.beginTransaction();
//                transaction.remove(CrimeFragment.this);
//                transaction.add(R.id.fragment_container,CrimeFragment.newInstance(CrimeLab.get(getActivity()).getLastId()));
////                transaction.replace(R.id.fragment_container,CrimeFragment.newInstance(CrimeLab.get(getActivity()).getLastId()));
//                transaction.addToBackStack(null);
//                transaction.commit();
            }
        });
        return view;
    }
}


虽然成功了,但是我发现一个问题,就是当点击按钮时,该栈会生成一个新的ViewPager

然后尝试了 模拟返回栈,但还是没用。后来找到了点击打开链接这一篇博客,让我发现自己这种写法的不足

上面那篇博客里面的写法的一个缺陷是按钮的停用无法控制,如果你知道更好的写法,请留言,谢谢!

你可能感兴趣的:(Android学习,挑战练习,Android编程权威指南)