設計思想————首先要確定有幾個頁面、和每個頁面的大致布局
由於是入門,我也是學習了不是很長的時間,所以項目比較low。。。。
第一個頁面,也就是打開APP的首頁面:
今天這個博客,先實現添加功能!:
首先對主界面進行布局:其中 activity_main.xml的代碼為
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context=".MainActivity" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:onClick="click1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="新建" /> <Button android:onClick="click2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="delete" /> </LinearLayout> </LinearLayout>
然后就是MainActivity的代碼了,其中內部含有注釋,而且我實際使用的是BaseAdapter,但是在學習的過程中我發現SimpleAdatapter更加方便簡單,所以我以注釋的形式將SimpleAdapter的內容保存了,。可以方便學習:
package com.example.hhah; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.w3c.dom.Text; import org.w3c.dom.ls.LSInput; import android.app.Activity; import android.app.DownloadManager.Query; import android.content.ClipData.Item; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.provider.ContactsContract.DataUsageFeedback; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private ArrayList<Bean> list; private MyOpenHelper myOpenHelper; private SQLiteDatabase db; private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); list = new ArrayList<Bean>(); lv = (ListView) this.findViewById(R.id.lv); myOpenHelper = new MyOpenHelper(this); db = myOpenHelper.getWritableDatabase(); Cursor cursor = db.rawQuery("select * from biao01;", null); while (cursor.moveToNext()) { String t_name = cursor.getString(cursor.getColumnIndex("t_name")); String t_place = cursor.getString(cursor.getColumnIndex("t_place")); String time = cursor.getString(cursor.getColumnIndex("time")); Bean bean = new Bean(); bean.setT_name(t_name); bean.setT_place(t_place); bean.setTime(time); list.add(bean); } MyAdapter myAdapter = new MyAdapter(this, list, R.layout.item); /* * ArrayList<HashMap<String, Object>> yy = new * ArrayList<HashMap<String,Object>>(); for(Bean bean1:list) { HashMap<String, * Object> zzz = new HashMap<String,Object>(); zzz.put("t_name", * bean1.getT_name()); zzz.put("t_place", bean1.getT_place()); zzz.put("time", * bean1.getTime()); yy.add(zzz); } SimpleAdapter simpleAdapter=new * SimpleAdapter(this, yy, R.layout.item, new String[] * {"t_name","t_place","time"},new int[] * {R.id.tv_name,R.id.tv_place,R.id.tv_time}); * */ lv.setAdapter(myAdapter); } public void click1(View view) { // 該方法只用於跳轉,實際增加步驟在增加頁面 Intent intent = new Intent(); intent.setAction("android.intent.action.add"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent); } }
在上面我提到,這個APP涉及到連接數據庫,所以我們必須要實現SQLiteOpenHelper為我們提供的諸多方法,所以我創建了一個類,專門用來連接數據庫以及實現方法:
package com.example.hhah; import java.sql.ResultSet; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { // context:上下文 // name:數據庫名字 // 目的創建cursor對象 // 數據庫的版本從一開始 public MyOpenHelper(Context context) { super(context, "zhanghao", null, 1); } @Override // 當數據庫第一次被創建的時候調用,用來建表 public void onCreate(SQLiteDatabase db) { db.execSQL("create table biao01 (t_name varchar(20),t_place varchar(20),time varchar(20));"); db.execSQL("insert into biao01 values('吃飯','白駱駝','2019.3.21');"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
因為上面提到,我用的是baseadapter所以我也新建了一個class用來配置適配器繼承BaseAdapter,其實這個一般是固定的寫法,你也可以使用在MainActivity里內部類。不過不推薦使用內部類,因為容易導致其代碼結構錯亂,引發諸多問題:
package com.example.hhah; import java.util.ArrayList; import android.content.Context; import android.text.Layout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class MyAdapter extends BaseAdapter { private Context context; private ArrayList<Bean> list = new ArrayList<Bean>(); private LayoutInflater inflator; private int resore; private TextView t_name; private TextView t_place; private TextView time; public MyAdapter(Context context, ArrayList<Bean> list, int resore) { this.context = context; this.list = list; this.resore = resore; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { inflator = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); convertView = inflator.inflate(resore, null); t_name = (TextView) convertView.findViewById(R.id.tv_name); t_place = (TextView) convertView.findViewById(R.id.tv_place); time = (TextView) convertView.findViewById(R.id.tv_time); } Bean bean = list.get(position); t_name.setText(bean.getT_name()); t_place.setText(bean.getT_place()); time.setText(bean.getTime()); return convertView; } }
然后就是最簡單的Bean對象了,同樣是新建一個類(變量比較少,也是為了方便學習,如果要實現更多的記錄內容可以自行添加):
package com.example.hhah; public class Bean { private String t_name; private String time; private String t_place; public String getT_name() { return t_name; } public void setT_name(String t_name) { this.t_name = t_name; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getT_place() { return t_place; } public void setT_place(String t_place) { this.t_place = t_place; } }
好那么只涉及增加的主界面搭建好了,接下來就是實現增加功能的頁面,以及運用適配器傳輸數據的接口頁面:
我的添加界面:
還是,創建一個xml文件。用來顯示這個添加頁面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".addActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="事件名:" android:textSize="30dp" /> <EditText android:id="@+id/et_things" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入事件名" android:textSize="25dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="時間:" android:textSize="30dp" /> <EditText android:id="@+id/et_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入時間" android:textSize="25dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="地點:" android:textSize="30dp" /> <EditText android:id="@+id/et_place" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入地點" android:textSize="25dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="click_add" android:text="添加" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="click_return" android:text="放棄添加" /> </LinearLayout>
然后就是用來實現接口功能的item.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:orientation="horizontal" > <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" /> <TextView android:id="@+id/tv_place" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" /> <TextView android:id="@+id/tv_time" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" /> </LinearLayout>
之后創建一個AddActivity,進行數據的輸入,之后點擊按鈕,將數據保存到數據庫:
package com.example.hhah; import java.util.List; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class addActivity extends Activity { private EditText et_thing; private EditText et_place; private EditText et_time; private SQLiteDatabase db; private Bean bean; private long ll; private MyOpenHelper myOpenHelper; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // 加載布局 setContentView(R.layout.add_activity); et_thing = (EditText) findViewById(R.id.et_things); et_place = (EditText) findViewById(R.id.et_place); et_time = (EditText) findViewById(R.id.et_time); myOpenHelper = new MyOpenHelper(getApplicationContext()); // db = myOpenHelper.getWritableDatabase(); } public void click_add(View view) { db = myOpenHelper.getWritableDatabase(); String thing = et_thing.getText().toString().trim(); String place = et_place.getText().toString().trim(); String time = et_time.getText().toString().trim(); if (TextUtils.isEmpty(thing) || TextUtils.isEmpty(place) || TextUtils.isEmpty(time)) { Toast.makeText(getApplicationContext(), "親輸入內容不能為空哦!", 1).show(); return; } else { bean = new Bean(); bean.setT_name(thing); bean.setT_place(place); bean.setTime(time); ContentValues values = new ContentValues(); values.put("t_name", thing); values.put("t_place", place); values.put("time", time); ll = db.insert("biao01", null, values); db.close(); System.out.println(ll); if (ll > 0) { Toast.makeText(getApplicationContext(), "保存成功", 1).show(); addActivity.this.finish(); } else { Toast.makeText(getApplicationContext(), "系統繁忙,請稍后再試!", 1).show(); } } } public void click_return(View view) { addActivity.this.finish(); } }
最后千萬別忘了配置清單文件!!!具體涉及到的內容如下:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.hhah.MainActivity" android:label="@string/app_name" > <!-- main主入口 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.hhah.addActivity" > <!-- main主入口 --> <intent-filter> <action android:name="android.intent.action.add" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application>
好做到這里,添加功能就實現了,那么之后的博客,會對其他功能進行實現,也會逐步的對界面進行美化,畢竟現在這個界面是在是難以入目。。。