【Android】大作业 功能2:Menu菜单功能

功能2:Menu菜单功能
  1. 完成内容
    为系统添加Menu菜单完成相关任务,菜单项包括:
    (1)添加新闻
    (2)删除新闻
    (3)快速查询
    (4)修改新闻
  2. 需求说明:
    (1)创建optionmenu类型菜单
    (2)处理菜单按下的事件

1 定义数据库相关方法

MyOpenHelper.java

package cn.com.sgmsc.news;			//声明包语句

import android.content.Context;				
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MyOpenHelper extends SQLiteOpenHelper{
	public static final String DB_NAME = "NewsSyx";	        	//数据库文件名称
	public static final String TABLE_NAME = "NewsTb";		    //表名
	public static final String ID="news_id";					//新闻ID
	public static final String TITLE="news_title";				//新闻标题
	public static final String TYPE="news_type";				//新闻类型
	public static final String CONTENT="news_content";			//新闻内容

    //调用父类构造器
	public MyOpenHelper(Context context, String name, CursorFactory factory,int version) {
		super(context, name, factory, version);		
	}
	@Override  //重写onCreate方法
	public void onCreate(SQLiteDatabase db) {		
		db.execSQL("create table if not exists "+TABLE_NAME+" ("	//调用execSQL方法创建表
				+ ID + " integer primary key,"
				+ TITLE + " varchar,"
				+ TYPE + " integer,"
				+ CONTENT+" text)");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//重写onUpgrade方法
	}
}

2 定义菜单界面事件

MenuActivity.java

package cn.com.sgmsc.news;

import android.view.MenuItem.OnMenuItemClickListener;


import static cn.com.sgmsc.news.MyOpenHelper.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.Color;

import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MenuActivity extends Activity {
    MyOpenHelper myHelper;						//声明MyOpenHelper对象
    
    //四个条目显示的先后顺序
    final int MENU_ADD = Menu.FIRST;
    final int MENU_DELETE = Menu.FIRST + 1;
    final int MENU_QUERY = Menu.FIRST + 2;
    final int MENU_MODIFY = Menu.FIRST + 3;
    
    final int DIALOG_DELETE = 0;				//确认删除对话框的ID
    int [] newsID;								//声明用于存放新闻ID的数组
    String [] newsTitle;						//声明用于存放新闻标题的数组
    int [] newsType;							//声明用于存放新闻类型的数组
    int pos = -1;								//ListView对象中的当前项位置
    ListView lv;								//声明ListView对象
    
    BaseAdapter myAdapter = new BaseAdapter(){
		@Override
		public int getCount() {
			if(newsTitle != null){  			//如果新闻数组不为空
				return newsTitle.length;
			}
			else {
				return 0;						//如果新闻数组为空则返回0
			}
		}
		
		@Override
		public Object getItem(int arg0) {return null;}
		
		@Override
		public long getItemId(int arg0) {return 0;}
		
		//ListView界面UI定义
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LinearLayout ll = new LinearLayout(MenuActivity.this);     //创建线性布局
			ll.setOrientation(LinearLayout.HORIZONTAL);
			ll.setGravity(Gravity.CENTER_VERTICAL);
			
			//定义新闻列表的每条目的内容,包括新闻标题、新闻ID信息
			LinearLayout ll1 = new LinearLayout(MenuActivity.this);//创建子线性布局
			ll1.setOrientation(LinearLayout.VERTICAL);
			ll1.setLayoutParams(new LinearLayout.LayoutParams(166,LayoutParams.WRAP_CONTENT));
			ll1.setPadding(3, 0, 0, 0);								//设置边界空白
			
			TextView tvID = new TextView(MenuActivity.this);
			tvID.setText("新闻ID:"+newsID[position]);
			tvID.setTextSize(10.0f);								//设置字体大小
			tvID.setTextColor(Color.WHITE);							//设置字体颜色
			
			TextView tvTitle = new TextView(MenuActivity.this);		//创建用于显示新闻标题的TextView
			tvTitle.setText("新闻标题:"+newsTitle[position]);			//设置新闻标题的内容
			tvTitle.setTextSize(16.0f);								//设置字体大小
			tvTitle.setTextColor(Color.WHITE);						//设置字体颜色
			
			ll1.addView(tvTitle);									//将显示标题的TextView添加到线性布局
			ll1.addView(tvID);
			
			LinearLayout llButton = new LinearLayout(MenuActivity.this); //创建子线性布局,布局按钮
			llButton.setOrientation(LinearLayout.HORIZONTAL);			
			llButton.setLayoutParams(new LinearLayout.LayoutParams
					                           (LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
			llButton.setPadding(3, 0, 3, 0);						//setPadding参数:(left, top, right, bottom)			
			llButton.setGravity(Gravity.RIGHT);
			Button btnViewNews = new Button(MenuActivity.this);		//创建查看按钮
			btnViewNews.setTextAppearance(MenuActivity.this, R.style.button);
			btnViewNews.setLayoutParams(new LinearLayout.LayoutParams(
					                         50, LayoutParams.WRAP_CONTENT));
			btnViewNews.setText(R.string.btnView);
			btnViewNews.setId(position);							//设置Button的ID
			btnViewNews.setOnClickListener(listenerToView);			//设置按钮的监听器
			Button btnDeleteNews = new Button(MenuActivity.this);	//创建删除按钮
			btnDeleteNews.setTextAppearance(MenuActivity.this, R.style.button);
			btnDeleteNews.setLayoutParams(new LinearLayout.LayoutParams(
					                            50, LayoutParams.WRAP_CONTENT));
			btnDeleteNews.setText(R.string.btnDel);
			btnDeleteNews.setId(position);							//设置Button的ID
			btnDeleteNews.setOnClickListener(listenerToDelete);		//设置按钮的监听器
			llButton.addView(btnViewNews);
			llButton.addView(btnDeleteNews);
			ll.addView(ll1);									//将子对象添加到父布局中
			ll.addView(llButton);	
			
			return ll;
		}
	};
	
	//每个条目对应的查看按钮事件
	View.OnClickListener listenerToView = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			pos = v.getId();       			//取ListView当前项的ID
			Intent intent= new Intent(MenuActivity.this,NewsDetailActivity.class);
			intent.putExtra("cmd", 0);		//0代表查看或修改新闻,1代表添加新闻
			intent.putExtra("id", newsID[pos]);
			startActivity(intent);
		}
	};
	//每个条目对应的删除按钮事件
	View.OnClickListener listenerToDelete = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
           	pos = v.getId();				//取ListView当前项的ID
			showDialog(DIALOG_DELETE);		//显示确认删除对话框,并实施相应操作
		}
	};
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        
        myHelper = new MyOpenHelper(this, DB_NAME, null, 1);//打开数据表库表
        
        lv = (ListView) findViewById(R.id.listNews); 		//获得ListView对象的引用
        lv.setAdapter(myAdapter);
     }
    
    @Override
	protected void onResume() {
		getBasicInfo(myHelper);  							//重新获取数据库信息
		myAdapter.notifyDataSetChanged();  					//刷新ListView
		super.onResume();
	}
    
  //方法:获取数据表中所有记录部分列的数据内容
    public void getBasicInfo(MyOpenHelper helper){
    	SQLiteDatabase db = helper.getWritableDatabase();		//获取数据库连接
    	Cursor c = db.query(TABLE_NAME, new String[]{ID,TITLE,TYPE}, 
    			             null,null, null, null, ID);
    	int idIndex = c.getColumnIndex(ID);
    	int titleIndex = c.getColumnIndex(TITLE);				//获得标题列的列号
    	int typeIndex = c.getColumnIndex(TYPE);	    			//获得类型列的序号
    	newsID = new int[c.getCount()];							//创建存放id的int数组对象
    	newsTitle = new String[c.getCount()];					//创建存放标题的String数组对象
    	newsType = new int[c.getCount()];						//创建存放类型的String数组对象
    	int i=0;												//声明一个计数器
    	for(c.moveToFirst();!(c.isAfterLast());c.moveToNext()){
    		newsID[i] = c.getInt(idIndex);
    		newsTitle[i] = c.getString(titleIndex);				//将标题添加到String数组中
    		newsType[i] = c.getInt(typeIndex);					//将类型添加到String数组中
    		i++;
    	}
    	if(i==0) {
    		newsID = new int[1];
    		newsID[0]=-1;
    	}
    	c.close();												//关闭Cursor对象
    	db.close();												//关闭SQLiteDatabase对象
    }
    
    //创建选项菜单
    @Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(0, MENU_ADD, 0, R.string.btnAdd);  			//添加“添加新闻”菜单选项
		menu.add(0, MENU_DELETE, 0, R.string.btnDelete);  		//添加“删除新闻”菜单选项
		menu.add(0, MENU_QUERY, 0, R.string.btnQuery);			//添加“快速查询”菜单选项
		menu.add(0, MENU_MODIFY, 0, R.string.btnModify);		//添加”修改新闻“菜单选项
		return true;
	}
    
	//定义菜单项被选中后的回调事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch(item.getItemId()){								//判断按下的菜单选项
		case MENU_ADD:											//按下了“添加新闻”菜单
			Intent intentAdd= new Intent(MenuActivity.this,NewsDetailActivity.class);
			intentAdd.putExtra("cmd", 1);
			startActivity(intentAdd);
			break;
		case MENU_DELETE:										//按下了“删除新闻”菜单
			//根据新闻ID进行查询并删除
			if(newsID[0]==-1) {
				showMessage("delete");
			}
			else {
				/*注释掉的是删除最前的条目的代码*/
//				pos = 0;//取ListView当前项的ID
//				showDialog(DIALOG_DELETE);				      	//显示确认删除对话框,并实施相应操作
				Intent intentDelete= new Intent(MenuActivity.this,DelActivity.class);
				startActivity(intentDelete);
			}
			break;
		case MENU_QUERY:										//按下了“快速查询”菜单
			//根据新闻类型进行查询
			if(newsID[0]==-1) {
				showMessage("query");
			}
			else {
				Intent intentQuery= new Intent(MenuActivity.this,QueryActivity.class);
				startActivity(intentQuery);
			}
			break;
		case MENU_MODIFY:										//按下了“修改新闻”菜单
			//对第一个条目的新闻进行修改
			if(newsID[0]==-1) {
				showMessage("modify");
			}
			else {
				Intent intentMod= new Intent(MenuActivity.this,NewsDetailActivity.class);
				intentMod.putExtra("cmd", 0);
				intentMod.putExtra("id", newsID[0]);
				startActivity(intentMod);
				break;
			}
		}
		return true;
	}
	
	//创建对话框
	@Override
	protected Dialog onCreateDialog(int id) {
		Dialog dialog = null;
		switch(id){											//对对话框ID进行判断 
		case DIALOG_DELETE:									//创建删除确认对话框
			Builder b = new AlertDialog.Builder(this);	
			b.setIcon(R.drawable.dialog_delete);			//设置对话框图标
			b.setTitle("提示");								//设置对话框标题
			b.setMessage(R.string.dialog_message);			//设置对话框内容
			b.setPositiveButton(R.string.btnOk,
						new OnClickListener() {				//按下对话框的确认按钮
						@Override
						public void onClick(DialogInterface dialog, int which) {
							deleteNews(newsID[pos]);		//调用删除处理方法
						}
					});
			b.setNegativeButton(R.string.btnCancel,
						new OnClickListener() { 				//按下对话框的取消按钮
						@Override
						public void onClick(DialogInterface dialog, int which) {}
					});
			dialog = b.create();
			break;
		}
		return dialog;
	}	
	
	//方法:删除指定的新闻记录
	public void deleteNews(int id){							//id为要删除记录的id
		SQLiteDatabase db = myHelper.getWritableDatabase();		//获得数据库对象
	    try{	
	    	int count=db.delete(TABLE_NAME, ID+"=?", new String[]{id+""});
	    	db.close();
	    	if(count == 1){										//删除成功
	    		getBasicInfo(myHelper);  //重新获取数据库信息
	    		myAdapter.notifyDataSetChanged();  //刷新ListView
	    	}
		}catch(Exception e){
					e.printStackTrace();
		}
	}
	
	//显示提示信息
    public void showMessage(String str) {
    	if(str.equals("modify"))
    		Toast.makeText(MenuActivity.this, "条目为空,不可修改!", Toast.LENGTH_SHORT).show();
    	else if(str.equals("delete")) 
    		Toast.makeText(MenuActivity.this, "条目为空,不可删除!", Toast.LENGTH_SHORT).show();
    	else if(str.equals("query"))
    		Toast.makeText(MenuActivity.this, "条目为空,不可查询!", Toast.LENGTH_SHORT).show();
    	else
    		Toast.makeText(MenuActivity.this, "出错", Toast.LENGTH_SHORT).show();
    }
}

3 定义菜单界面UI

activity_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
    	android:layout_width="fill_parent"
    	style="@style/tips"
    	android:layout_height="wrap_content"
    	android:text="按menu键(右上角三个点)弹出菜单"
        />
    <ScrollView
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:fillViewport="true"
    	>
		<ListView	
			android:id="@+id/listNews"
			style="@style/content"
			android:divider="@color/listDivider"
			android:dividerHeight="1px"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent"
			android:choiceMode="singleChoice"
			/> 
		</ScrollView>
</LinearLayout>

4 界面展示

Menu
Menu

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

社恐患者

赚钱不易呜呜呜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值