1. 程式人生 > >一款神器--CriminalIntent

一款神器--CriminalIntent

extra public code 操作系統 mat 建立 nco 代碼 同學

一款功能強大的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;
import
android.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