《安卓程式設計權威指南》第十一章 挑戰練習
阿新 • • 發佈:2018-12-30
第一個挑戰:恢復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新增按鈕然後直接在CrimeLab這個單例類裡新增頭尾兩個變數<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" />
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
然後嘗試了 模擬返回棧,但還是沒用。後來找到了點選開啟連結這一篇部落格,讓我發現自己這種寫法的不足
上面那篇部落格裡面的寫法的一個缺陷是按鈕的停用無法控制,如果你知道更好的寫法,請留言,謝謝!