第一个挑战:恢复CrimeFragment的边距
1、既然要设边距,那我们就先增加一个边距
在res>>values里新建一个dimen.xml,在里面设置间距内容如下:
<resources>
<dimen name="pager_margin">50.0dip</dimen>
</resources>
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添加按钮
<Button
android:id="@+id/jump_to_first"
android:text="jump to first"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/jump_to_last"
android:text="jump to last"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
然后直接在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
然后尝试了 模拟返回栈,但还是没用。后来找到了点击打开链接这一篇博客,让我发现自己这种写法的不足
上面那篇博客里面的写法的一个缺陷是按钮的停用无法控制,如果你知道更好的写法,请留言,谢谢!