1. 程式人生 > >《安卓程式設計權威指南》第十一章 挑戰練習

《安卓程式設計權威指南》第十一章 挑戰練習

第一個挑戰:恢復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

然後嘗試了 模擬返回棧,但還是沒用。後來找到了點選開啟連結這一篇部落格,讓我發現自己這種寫法的不足

上面那篇部落格裡面的寫法的一個缺陷是按鈕的停用無法控制,如果你知道更好的寫法,請留言,謝謝!