Android编程权威指南第3版 9.5 挑战练习:日期格式化
生活随笔
收集整理的這篇文章主要介紹了
Android编程权威指南第3版 9.5 挑战练习:日期格式化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載請注明出處
目錄
- 前言
- 1. 添加資源
- 2. Crime.java
- 3. CrimeActivity.java
- 4. CrimeFragment.java
- 5. CrimeLab.java
- 6. CrimeListActivity.java
- 7. CrimeListFragment.java
- 8. SingleFragActivity.java
- 9. activity_fragment.xml
- 10.fragment_crime.xml
- 11. fragment_crime_list.xml
- 12. list_item_crime.xml
- 13. strings.xml
- 14. AndroidManifest.xml
- 15. 運行
前言
本文參考《Android編程權威指南》第三版。
僅供學習,侵權即刪。
如有不當之處,還望指正。
1. 添加資源
把如下紅色框框框住的內容復制到自己所寫項目的相應位置。
對應如下位置:
2. Crime.java
package com.example.criminal; import java.util.Date; import java.util.UUID; public class Crime {private UUID mId;private String mTitle;private Date mDate;private boolean mSolved;public Crime(){mId =UUID.randomUUID();mDate = new Date();}public UUID getId() {return mId;}public String getTitle() {return mTitle;}public void setTitle(String title) {mTitle = title;}public Date getDate() {return mDate;}public void setDate(Date date) {mDate = date;}public boolean isSolved() {return mSolved;}public void setSolved(boolean solved) {mSolved = solved;} }3. CrimeActivity.java
package com.example.criminal;import androidx.fragment.app.Fragment;public class CrimeActivity extends SingleFragActivity {@Overrideprotected Fragment createFragment() {return new CrimeFragment();}}4. CrimeFragment.java
package com.example.criminal;import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment;import static android.widget.CompoundButton.*;public class CrimeFragment extends Fragment {private Crime mCrime;private EditText mTitleField;private Button mDateButton;private CheckBox mSolvedCheckBox;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mCrime = new Crime();}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View v = inflater.inflate(R.layout.fragment_crime, container, false);mTitleField = (EditText)v.findViewById(R.id.crime_title);mTitleField.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {mCrime.setTitle(s.toString());}@Overridepublic void afterTextChanged(Editable s) {}});mDateButton = (Button) v.findViewById(R.id.crime_date);mDateButton.setText(mCrime.getDate().toString());mDateButton.setEnabled(false);mSolvedCheckBox = (CheckBox) v.findViewById(R.id.crime_solved);mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {mCrime.setSolved(isChecked);}});return v;} }5. CrimeLab.java
package com.example.criminal;import android.content.Context;import java.util.ArrayList; import java.util.List; import java.util.UUID;public class CrimeLab {private static CrimeLab sCrimeLab;private List<Crime> mCrimes;public static CrimeLab get(Context context){if (sCrimeLab == null){sCrimeLab = new CrimeLab(context);}return sCrimeLab;}private CrimeLab(Context context){mCrimes = new ArrayList<>();for (int i = 0; i<100;i++){Crime crime = new Crime();crime.setTitle("Crime #" + i);crime.setSolved(i % 2 == 0);mCrimes.add(crime);}}public List<Crime>getCrimes(){return mCrimes;}public Crime getCrime(UUID id) {for (Crime crime : mCrimes){if (crime.getId().equals(id)){return crime;}}return null;} }6. CrimeListActivity.java
package com.example.criminal; import androidx.fragment.app.Fragment;public class CrimeListActivity extends SingleFragActivity {@Overrideprotected Fragment createFragment() {return new CrimeListFragment();} }7. CrimeListFragment.java
package com.example.criminal;import android.os.Bundle; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import java.util.List;public class CrimeListFragment extends Fragment {private RecyclerView mCrimeRecycleView;private CrimeAdapter mAdapter;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_crime_list,container,false);mCrimeRecycleView = view.findViewById(R.id.crime_recycler_view);mCrimeRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));updataUI();return view;}private void updataUI() {CrimeLab crimeLab = CrimeLab.get(getActivity());List<Crime> crimes = crimeLab.getCrimes();mAdapter = new CrimeAdapter(crimes);mCrimeRecycleView.setAdapter(mAdapter);}private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener {private TextView mTitleTextView;private TextView mDateTextView;private Crime mCrime;private ImageView mSolvedImageview;private CrimeHolder(LayoutInflater inflater,ViewGroup parent){super(inflater.inflate(R.layout.list_item_crime,parent,false));itemView.setOnClickListener(this);mTitleTextView = itemView.findViewById(R.id.crime_title);mDateTextView = itemView.findViewById(R.id.crime_date);mSolvedImageview = itemView.findViewById(R.id.crime_solved);}@Overridepublic void onClick(View v) {Toast.makeText(getActivity(),mCrime.getDate()+ "clicked",Toast.LENGTH_LONG).show();}private void bind(Crime crime) {mCrime = crime;mTitleTextView.setText(mCrime.getTitle());String date;date = (String) DateFormat.format("EEEE,MMMMM dd,yyyy kk:mm",mCrime.getDate());mDateTextView.setText(date);mSolvedImageview.setVisibility(crime.isSolved() ? View.VISIBLE :View.GONE);}}private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {private List<Crime> mCrimes;private CrimeAdapter(List<Crime>crimes ){mCrimes = crimes;}@NonNull@Overridepublic CrimeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {LayoutInflater layoutInflater = LayoutInflater.from(getActivity());return new CrimeHolder(layoutInflater,parent);}@Overridepublic void onBindViewHolder(@NonNull CrimeHolder holder, int position) {Crime crime = mCrimes.get(position);holder.bind(crime);}@Overridepublic int getItemCount() {return mCrimes.size();}} }8. SingleFragActivity.java
package com.example.criminal;import android.os.Bundle;import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager;public abstract class SingleFragActivity extends AppCompatActivity {protected abstract Fragment createFragment();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment);FragmentManager fm = getSupportFragmentManager();Fragment fragment = fm.findFragmentById(R.id.fragment_container);if (fragment == null){fragment = createFragment();fm.beginTransaction().add(R.id.fragment_container,fragment).commit();}} }9. activity_fragment.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />10.fragment_crime.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="16dp"android:orientation="vertical"><TextViewstyle="?android:listSeparatorTextViewStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/crime_title_label"/><EditTextandroid:id="@+id/crime_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="@string/crime_title_hint" /><TextViewstyle="?android:listSeparatorTextViewStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/crime_details_label"/><Buttonandroid:id="@+id/crime_date"android:layout_width="match_parent"android:layout_height="wrap_content"/><CheckBoxandroid:id="@+id/crime_solved"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/crime_solved_label"/> </LinearLayout>11. fragment_crime_list.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/crime_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"/>在如下位置下載RecyclerView。
12. list_item_crime.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_height="wrap_content"android:layout_width="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><TextViewandroid:layout_height="wrap_content"android:layout_width="0dp"app:layout_constraintTop_toTopOf="parent"app:layout_constraintRight_toLeftOf="@+id/crime_solved"app:layout_constraintLeft_toLeftOf="parent"android:textSize="18sp"android:textColor="@android:color/black"android:text="Crime Title"android:layout_marginTop="16dp"app:layout_goneMarginStart="16dp"app:layout_goneMarginEnd="8dp"android:id="@+id/crime_title"/><TextViewandroid:layout_height="wrap_content"android:layout_width="0dp"app:layout_constraintRight_toLeftOf="@id/crime_solved"app:layout_constraintLeft_toLeftOf="parent"android:text="Crime Date"android:layout_marginTop="8dp"app:layout_goneMarginStart="16dp"app:layout_goneMarginEnd="8dp"android:id="@+id/crime_date"app:layout_constraintTop_toBottomOf="@+id/crime_title"/><ImageViewandroid:id="@+id/crime_solved"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:layout_marginBottom="16dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_goneMarginEnd="16dp"app:srcCompat="@drawable/ic_solved"tools:srcCompat="@drawable/ic_solved" /></androidx.constraintlayout.widget.ConstraintLayout>13. strings.xml
<resources><string name="app_name">Criminal</string><string name="crime_title_hint">Enter a title for the crime.</string><string name="crime_title_label">Title</string><string name="crime_details_label">Details</string><string name="crime_solved_label">Solved</string> </resources>14. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.criminal"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".CrimeListActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".CrimeActivity" /></application></manifest>15. 運行
總結
以上是生活随笔為你收集整理的Android编程权威指南第3版 9.5 挑战练习:日期格式化的全部內容,希望文章能夠幫你解決所遇到的問題。