我要设计一个安卓记事本app,要求有登录界面,登录成功后跳转主界面,主界面上方包含搜索框,和类别下拉框,然后有两个按钮,一个按钮为计事,一个按钮为代办,点击两个按钮会在主界面进行切换内容的展示,下方有加号,点击进入编辑界面进行添加,修改,并且能够选择是记事或者代办,代办要求有定时功能,并且添加会修改后主界面能够显示,长按主界面的记录可以删除,你能帮我用代码,包括所描述的布局文件代码实现吗,数据库用SQLlite,
时间: 2023-06-18 12:03:26 浏览: 56
当然可以,以下是一个简单实现的代码,建议作为参考,在实际开发中可以根据需求进行修改和优化。
首先是登录界面的布局文件 login_activity.xml:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/login_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/logo" />
<EditText
android:id="@+id/username_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/username_hint"
android:inputType="text" />
<EditText
android:id="@+id/password_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password_hint"
android:inputType="textPassword" />
<Button
android:id="@+id/login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/login_button_text" />
</LinearLayout>
```
接下来是主界面的布局文件 main_activity.xml:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/search_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/search_edittext"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/search_hint"
android:inputType="text" />
<Spinner
android:id="@+id/category_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/category_array"
android:prompt="@string/category_prompt" />
</LinearLayout>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:id="@+id/button_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/note_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/note_button_text" />
<Button
android:id="@+id/todo_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/todo_button_text" />
<ImageButton
android:id="@+id/add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add" />
</LinearLayout>
</LinearLayout>
```
主界面的内容部分是一个 FrameLayout,用来显示计事和代办内容的 Fragment。接下来是计事和代办显示的 Fragment 的布局文件 note_fragment.xml 和 todo_fragment.xml:
note_fragment.xml:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/note_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/note_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
```
todo_fragment.xml:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/todo_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/todo_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
```
接下来是添加和编辑记事或代办的界面的布局文件 edit_activity.xml:
```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/edit_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/title_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/title_hint"
android:inputType="text" />
<EditText
android:id="@+id/content_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/content_hint"
android:inputType="textMultiLine" />
<RadioGroup
android:id="@+id/type_radiogroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/note_radiobutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/note_radiobutton_text" />
<RadioButton
android:id="@+id/todo_radiobutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/todo_radiobutton_text" />
</RadioGroup>
<LinearLayout
android:id="@+id/time_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/time_text" />
<EditText
android:id="@+id/time_edittext"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/time_hint"
android:inputType="time" />
</LinearLayout>
<Button
android:id="@+id/save_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/save_button_text" />
</LinearLayout>
```
其中有一个 RadioGroup 和一个 LinearLayout,用来选择记事还是代办,如果选择代办,会显示定时器的选择界面。
最后是数据库操作的代码,包括表的创建和增删改查等操作,需要在 App 的启动时创建:
```java
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "notes.db";
private static final int DB_VERSION = 1;
public static final String NOTE_TABLE_NAME = "notes";
public static final String TODO_TABLE_NAME = "todos";
public static final String ID_FIELD_NAME = "_id";
public static final String TITLE_FIELD_NAME = "title";
public static final String CONTENT_FIELD_NAME = "content";
public static final String TYPE_FIELD_NAME = "type";
public static final String TIME_FIELD_NAME = "time";
private static final String CREATE_NOTE_TABLE = "CREATE TABLE " + NOTE_TABLE_NAME + " ("
+ ID_FIELD_NAME + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ TITLE_FIELD_NAME + " TEXT,"
+ CONTENT_FIELD_NAME + " TEXT,"
+ TYPE_FIELD_NAME + " INTEGER DEFAULT 0"
+ ");";
private static final String CREATE_TODO_TABLE = "CREATE TABLE " + TODO_TABLE_NAME + " ("
+ ID_FIELD_NAME + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ TITLE_FIELD_NAME + " TEXT,"
+ CONTENT_FIELD_NAME + " TEXT,"
+ TYPE_FIELD_NAME + " INTEGER DEFAULT 1,"
+ TIME_FIELD_NAME + " INTEGER"
+ ");";
private static final String DROP_NOTE_TABLE = "DROP TABLE IF EXISTS " + NOTE_TABLE_NAME;
private static final String DROP_TODO_TABLE = "DROP TABLE IF EXISTS " + TODO_TABLE_NAME;
private static DatabaseHelper sInstance;
private DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
public static synchronized DatabaseHelper getInstance(Context context) {
if (sInstance == null) {
sInstance = new DatabaseHelper(context.getApplicationContext());
}
return sInstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE);
db.execSQL(CREATE_TODO_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_NOTE_TABLE);
db.execSQL(DROP_TODO_TABLE);
onCreate(db);
}
public Cursor queryNotes() {
SQLiteDatabase db = getReadableDatabase();
String[] projection = {
ID_FIELD_NAME,
TITLE_FIELD_NAME,
CONTENT_FIELD_NAME
};
String selection = TYPE_FIELD_NAME + "=?";
String[] selectionArgs = { "0" };
String sortOrder = ID_FIELD_NAME + " DESC";
return db.query(
NOTE_TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
}
public Cursor queryTodos() {
SQLiteDatabase db = getReadableDatabase();
String[] projection = {
ID_FIELD_NAME,
TITLE_FIELD_NAME,
CONTENT_FIELD_NAME,
TIME_FIELD_NAME
};
String selection = TYPE_FIELD_NAME + "=?";
String[] selectionArgs = { "1" };
String sortOrder = TIME_FIELD_NAME;
return db.query(
TODO_TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
}
public long insertNote(String title, String content) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TITLE_FIELD_NAME, title);
values.put(CONTENT_FIELD_NAME, content);
return db.insert(NOTE_TABLE_NAME, null, values);
}
public long insertTodo(String title, String content, long time) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TITLE_FIELD_NAME, title);
values.put(CONTENT_FIELD_NAME, content);
values.put(TIME_FIELD_NAME, time);
return db.insert(TODO_TABLE_NAME, null, values);
}
public int updateNote(long id, String title, String content) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TITLE_FIELD_NAME, title);
values.put(CONTENT_FIELD_NAME, content);
String selection = ID_FIELD_NAME + "=?";
String[] selectionArgs = { String.valueOf(id) };
return db.update(NOTE_TABLE_NAME, values, selection, selectionArgs);
}
public int updateTodo(long id, String title, String content, long time) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(TITLE_FIELD_NAME, title);
values.put(CONTENT_FIELD_NAME, content);
values.put(TIME_FIELD_NAME, time);
String selection = ID_FIELD_NAME + "=?";
String[] selectionArgs = { String.valueOf(id) };
return db.update(TODO_TABLE_NAME, values, selection, selectionArgs);
}
public int deleteNote(long id) {
SQLiteDatabase db = getWritableDatabase();
String selection = ID_FIELD_NAME + "=?";
String[] selectionArgs = { String.valueOf(id) };
return db.delete(NOTE_TABLE_NAME, selection, selectionArgs);
}
public int deleteTodo(long id) {
SQLiteDatabase db = getWritableDatabase();
String selection = ID_FIELD_NAME + "=?";
String[] selectionArgs = { String.valueOf(id) };
return db.delete(TODO_TABLE_NAME, selection, selectionArgs);
}
}
```
以上就是一个简单的安卓记事本 App 的实现,如果需要更加详细的功能可以根据需求进行修改和优化。