一款神器--CriminalIntent
一款功能強大的App
先介紹下吧:CriminalIntent是一款可以幫助改善生活的app,對於記性不太好的同學應該挺有用的哈。功能很強大,比如:
(1)記錄某天某時需要做的事情、可以添加很多很多日期,所以不必擔心自己會忘記很多事了。
(2)軟件裏的排序清晰,可以在事件裏添加愉快、卡哇伊的表情哦,所以看起來不會那麽的單調。
(3)事件記錄通過日期自動排序,進入事件明細裏,還可以進行愉悅的滑動操作,看著有趣而且不會悶哦。
APP效果圖預覽
看起來很炫酷吧,強大到還能添加圖片與聯系人。不過,我通過完成了7到11章的代碼編寫與調試,只完成了事件記錄和滑動,還未實現通知及聯系人的功能。下面是我的魅族手機的app動態效果圖:
看起來效果還不錯吧!
下面我總結下這五章講述的內容,便於大家的理解:
第7章:項目初步搭建mvc模式,fragment的介紹,生命周期,托管方式,使用fragment的理由。
第8章:Crimefragment界面升級,水平模式布局。
第9章:創建單例CrimeLab(容納Crime對象),抽象activity類,RecycleView使用,相應點擊時間。
第10章:fragment數據傳遞—fragment argument,刷新RecycleView,通過fragment獲取返回結果。
第11章:Viewpager使用,FragmentStatePagerAdapter與FragmentPagerAdapter。
在完成編碼的途中,問題和註意點也遇到了不少:
(1) 首先,我們新建了CrimeActivity.java
package edu.niit.software.criminalintent; import android.content.Context; import android.content.Intent; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; importandroid.os.Bundle; import java.util.UUID; public class CrimeActivity extends SingleFragmentActivity { private static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id"; public static Intent newIntent(Context packageContext , UUID crimeId){ Intent intent = new Intent(packageContext,CrimeActivity.class); intent.putExtra(EXTRA_CRIME_ID , crimeId); return intent; } @Override protected Fragment createFragment() { UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID); return CrimeFragment.newInstance(crimeId); //return new CrimeFragment(); }
註意:在該fragment布局中,若新建類時工具默認加入了其他方法,比如onCreate,必須手動刪除,否則會使SingleFragmentActivity出現不可避免的問題,然後就會很麻煩了。
(2) 然後,建立CrimeActivity.java的視圖布局activity_crime.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/crime_view_pager"> </android.support.v4.view.ViewPager>
(3)後面,實現UI布局,定義了CrimeFragment類並且創建Fragment事務
public class CrimeFragment extends Fragment { private Crime mCrime; private EditText mTitleField; private Button mDateButton; private CheckBox mSolvedCheckBox; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCrime=new Crime(); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { //加載布局 View v=inflater.inflate(R.layout.fragment_crime,container,false); //生成並使用EditText組件 mTitleField=(EditText)v.findViewById(R.id.crime_title); mTitleField.addTextChangedListener(new TextWatcher() {//設置監聽器 @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mCrime.setTitle(s.toString()); } @Override public void afterTextChanged(Editable s) { // } }); //生成並使用Button組件 mDateButton=(Button)v.findViewById(R.id.crime_data); mDateButton.setText(mCrime.getDate().toString()); mDateButton.setEnabled(false); //生成並使用CheckBox組件 mSolvedCheckBox=(CheckBox)v.findViewById(R.id.crime_solved); mSolvedCheckBox.setChecked(mCrime.isSolved()); mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mCrime.setSolved(isChecked); } }); return v; } }
這裏要註意:編寫監聽器CheckBox時,需要使用alt+enter組合鍵添加包導入語句,Android Studio當提供兩個選擇時,必須選擇android.widget.CompoundButton,否則會出現報錯,導致運行錯誤。
(4)最後,通過Viewpager的使用,實現列表滑動切換,查詢不同日期的時間明細
package edu.niit.software.criminalintent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import java.util.List; import java.util.UUID; /** * Created by 666 on 2017/9/22. */ public class CrimePagerActivity extends AppCompatActivity { private static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id"; private ViewPager mViewPager; private List<Crime> mCrimes; 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 onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_crime_pager); UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID); mViewPager = (ViewPager) findViewById(R.id.crime_view_pager); mCrimes = CrimeLab.get(this).getCrimes(); FragmentManager fragmentManager = getSupportFragmentManager(); mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) { @Override public Fragment getItem(int position) { Crime crime = mCrimes.get(position); return CrimeFragment.newInstance(crime.getId()); } @Override public int getCount() { return mCrimes.size(); } }); for (int i = 0 ; i < mCrimes.size() ; i++){ if (mCrimes.get(i).getId().equals(crimeId)){ mViewPager.setCurrentItem(i); break; } } } }
註意:要使操作系統成功啟動CrimePagerActivity,需要打開AndroidManifest.xml,可以直接將CrimeActivity重命名為CrimePagerActivity.
這樣,我們的App界面就會美觀、功能就能強大了:
博客付出的是汗水,奉獻的是才學,寥寥幾筆,請君觀閱,如有辭錯,望君海涵!
一款神器--CriminalIntent