經過上述的編寫,基本的功能已經完成了,不過工具欄裏面基本還是一片空白,只有一個刷新的功能,現在咱們就先完善這些功能(之前有朋友說來點圖,那麼這次我會截些圖更好的來描述)。
既然是瀏覽器,怎麼能沒有書籤的功能,爲了操作方便,我就將添加的書籤放在地址欄的旁邊,我比較喜歡UC,那麼就來模仿UC吧☺
UC的功能是在點擊地址欄的時候會隱藏其他功能,好了,知道所要做的,那麼久開工了。
爲了佈局方便,我先將搜索的按鈕也放上去了。我在這裏將地址欄的佈局放上去:
<FrameLayout
android:id="@+id/web_url_all"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:id="@+id/web_url_layout"
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="@android:color/holo_blue_light"
android:orientation="horizontal"
android:visibility="gone">
<EditText
android:id="@+id/web_url_input"
android:layout_width="0dp"
android:layout_height="36dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_weight="0.8"
android:background="@drawable/search_back"
android:hint="@string/webUrlHint"
android:inputType="textUri"
android:paddingLeft="5dp"
android:textSize="15sp"/>
<Button
android:id="@+id/web_url_goto"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_weight="0.2"
android:text="@string/webUrlGoto"
android:visibility="gone"/>
<Button
android:id="@+id/web_url_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_weight="0.2"
android:text="@string/webUrlCancel"/>
</LinearLayout>
<LinearLayout
android:id="@+id/web_url_layout_normal"
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="@android:color/holo_blue_light"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/web_url_show"
android:layout_width="0dp"
android:layout_height="36dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_weight="0.8"
android:background="@drawable/search_back"
android:orientation="horizontal">
<Button
android:id="@+id/web_url_show_favorite"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_margin="5dp"
android:background="@drawable/favorites_button"/>
<ImageView
android:layout_width="2dp"
android:layout_height="27dp"
android:layout_marginTop="5dp"
android:background="@drawable/url_divider"
android:contentDescription="@string/divider"/>
<TextView
android:id="@+id/web_url_show_title"
android:layout_width="190dp"
android:layout_height="27dp"
android:layout_margin="5dp"
android:hint="@string/webUrlHint"/>
<ImageView
android:layout_width="32dp"
android:layout_height="25dp"
android:layout_marginTop="5dp"
android:background="@drawable/search_button"
android:contentDescription="@string/divider"/>
<TextView
android:id="@+id/web_url_show_search"
android:layout_width="30dp"
android:layout_height="27dp"
android:layout_marginTop="7dp"
android:hint="@string/search"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
代碼片段10.2.1 地址欄xml片段
其實因爲考慮到Android效率問題,我都是通過儘量在一個Activity中展示來實現程序,通過上面的xml我們可以看看效果:
圖10.2.1 地址欄更改後的顯示效果
可以看到,我們的地址欄已經成功展示。這個是通過activity的預覽功能來截圖的,以前沒發現這個功能這麼強大好用= =。
既然視圖已經完成,那麼接下來就是代碼的實現。
因爲實現的只是書籤的收藏功能,所以地址欄的隱藏顯示等,就在這裏不多說了,大家可以看我上傳的具體代碼。
書籤的收藏,我是通過數據庫來實現的,所以爲了方便操作,我對Cursor數據庫進行了基本操作的封裝。
首先,咱們定義一個數據庫的單元操作接口:
package com.example.database;
import java.util.HashMap;
import android.database.sqlite.SQLiteDatabase;
public interface IDatabase {
/**
* 增加書籤
* @param sqLiteDatabase 數據庫
* @param name 書籤名
* @param url 書籤地址
* */
public boolean addFavorite(SQLiteDatabase sqLiteDatabase, String name,String url);
/**
* 刪除書籤
* @param sqLiteDatabase 數據庫
* @param id 書籤ID
* */
public boolean deleteFavorite(SQLiteDatabase sqLiteDatabase, Stringid);
/**
* 修改書籤
* @param sqLiteDatabase 數據庫
* @param id 修改的書籤ID
* @param name 修改後的書籤名
* @param url 修改後的書籤地址
* */
public boolean modifyFavorite(SQLiteDatabase sqLiteDatabase, String id,String name, String url);
/**
* 獲取所有書籤
* @param sqLiteDatabase 數據庫
* @return HashMap<String, String>
* */
public HashMap<String, String>getAllFavorites(SQLiteDatabase sqLiteDatabase);
/**
* 查詢某個書籤是否存在,即查詢url是否重複
* @param sqLiteDatabase 數據庫
* @param url 書籤地址
* */
public boolean multiplyFavorite(SQLiteDatabase sqLiteDatabase, Stringurl);
/**
* 開始事務
* @param readOnly是否只讀
* @param callback函數回調
* */
void transactionAround(boolean readOnly, CallBack callback);
}
代碼片段10.2.2 數據庫接口定義
因爲爲了效率問題,我在這裏竟然少使用類,所以,並不像web一樣,使用對象處理的方式,而是將字段的值傳入。
並且,因爲事務的關係,我在這裏使用了回調函數,這樣可以很方便的進行事務的控制。
好了,接口已經定義好了,那麼就開始進行接口的實現:
package com.example.database;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class SQLManager extends SQLiteOpenHelperimplements IDatabase{
private static final String DEG_TAG ="webBrowser_SQLManager";
public SQLManager(Context context, String name, CursorFactoryfactory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//創建表
db.execSQL(SQLStr.CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) {
}
@Override
public boolean addFavorite(SQLiteDatabase sqLiteDatabase, String name,String url) {
ContentValues favorite = new ContentValues();
favorite.put("name", name);
favorite.put("url", url);
long id = sqLiteDatabase.insert("favorite",null, favorite);
if(id!=-1){
return true;
}else{
return false;
}
}
@Override
public boolean deleteFavorite(SQLiteDatabase sqLiteDatabase, String id){
int number = sqLiteDatabase.delete("favorite","id=?", new String[]{id});
if(number!=0){
return true;
}else{
return false;
}
}
@Override
public boolean modifyFavorite(SQLiteDatabase sqLiteDatabase, String id,String name, String url) {
ContentValues favorite = new ContentValues();
favorite.put("name", name);
favorite.put("url", url);
int number = sqLiteDatabase.update("favorite", favorite,"id=?", new String[]{id});
if(number!=0){
return true;
}else{
return false;
}
}
@Override
public HashMap<String, String>getAllFavorites(SQLiteDatabase sqLiteDatabase) {
HashMap<String, String> resultMap = new HashMap<String,String>();
Cursor result = sqLiteDatabase.query("favorite",null, null,null, null,null, "id");
while(result.moveToNext()){
String id = String.valueOf(result.getInt(result.getColumnIndex("id")));
String name = result.getString(result.getColumnIndex("name"));
String url = result.getString(result.getColumnIndex("url"));
Log.d(DEG_TAG,"id:"+id+",name:"+name+",url:"+url);
resultMap.put(id, name+" : "+url);
}
return resultMap;
}
@Override
public boolean multiplyFavorite(SQLiteDatabase sqLiteDatabase, Stringurl) {
Cursor result = sqLiteDatabase.query("favorite",null, "url=?", new String[]{url},null, null,null);
if(result.getCount()>0){
return true;
}else{
return false;
}
}
@Override
public void transactionAround(boolean readOnly, CallBack callback) {
SQLiteDatabase sqLiteDatabase = null;
if(readOnly){
sqLiteDatabase = this.getReadableDatabase();
}else{
sqLiteDatabase = this.getWritableDatabase();
}
sqLiteDatabase.beginTransaction();
callback.doSomething(sqLiteDatabase);
sqLiteDatabase.setTransactionSuccessful();
sqLiteDatabase.endTransaction();
}
}
代碼片段10.2.3 數據庫的實現
接口實現完畢,可以進行書籤事務的管理了,通過回調函數,來進行選擇SQLiteDatabase,並且開始事務的進行。
package com.example.other;
import java.util.HashMap;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.example.database.CallBack;
import com.example.database.IDatabase;
import com.example.database.SQLManager;
public class FavoritesManager {
private static final String DEG_TAG ="webbrowser_FavroitesManager";
private IDatabasedatabase;
private boolean flag = false;
private HashMap<String, String>resultMap;
public FavoritesManager(Context context){
this.database =new SQLManager(context, "favorite", null, 1);
}
/**
* 增加書籤
* @param name 書籤名
* @param url 書籤地址
* */
public boolean addFavorite(final String name,final String
url) {
flag = false;
this.database.transactionAround(false,new CallBack() {
@Override
public void doSomething(SQLiteDatabase sqLiteDatabase) {
boolean ifmultiply =database.multiplyFavorite(sqLiteDatabase, url);
if(!ifmultiply){
Log.d(DEG_TAG,"reason:未存在相同書籤");
flag = database.addFavorite(sqLiteDatabase, name, url);
}else{
Log.d(DEG_TAG,"reason:已經存在相同書籤");
flag = false;
}
}
});
Log.d(DEG_TAG,"result:"+flag);
return flag;
}
/**
* 刪除書籤
* @param id 書籤ID
* */
public boolean deleteFavorite(final String id) {
flag = false;
this.database.transactionAround(false,new CallBack() {
@Override
public void doSomething(SQLiteDatabase sqLiteDatabase) {
flag = database.deleteFavorite(sqLiteDatabase, id);
}
});
return flag;
}
/**
* 修改書籤
* @param id 修改的書籤ID
* @param name 修改後的書籤名
* @param url 修改後的書籤地址
* */
public boolean modifyFavorite(final String id,final String name, final String url) {
flag = false;
this.database.transactionAround(false,new CallBack() {
@Override
public void doSomething(SQLiteDatabase sqLiteDatabase) {
flag = database.modifyFavorite(sqLiteDatabase, id, name, url);
}
});
return flag;
}
/**
* 獲取所有書籤
* @return HashMap<String, String>
* */
public HashMap<String, String> getAllFavorites() {
resultMap = new HashMap<String, String>();
this.database.transactionAround(true,new CallBack() {
@Override
public void doSomething(SQLiteDatabase sqLiteDatabase) {
resultMap = database.getAllFavorites(sqLiteDatabase);
}
});
return resultMap;
}
}
代碼片段10.2.4 書籤事務管理
經過這些操作,我們就可以很容的發現我們的書籤管理基本完成。不過,現在只能夠添加事務,而不能夠查看。現在我們可以來添加一個書籤試試。
點擊星星按鈕:
圖10.2.2 控制欄信息
可以看到我們這裏已經成功添加。
現在咱們開始添加一個查看書籤的View界面。因爲TabActivity的界面不怎麼好弄,所以,打算以FrameLayout的界面來進行界面的切換。
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favoritesAndHisotry"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/white"
>
<LinearLayout
android:id="@+id/favoritesAndHisotry_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:orientation="horizontal">
<TextView
android:id="@+id/favorites"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:layout_weight="0.5"
android:gravity="center"
android:text="@string/favorite"
android:textColor="@android:color/white"
android:textSize="20sp"/>
<TextView
android:id="@+id/history"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:layout_weight="0.5"
android:gravity="center"
android:text="@string/hisotry"
android:textColor="@android:color/white"
android:textSize="20sp"/>
</LinearLayout>
<FrameLayout
android:id="@+id/favoritesAndHisotry_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/favoritesAndHisotry_button">
<ListView
android:id="@+id/favoritesAndHisotry_content_favorite"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#E2E2E2"
android:dividerHeight="1dp">
</ListView>
<ListView
android:id="@+id/favoritesAndHisotry_content_history"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#E2E2E2"
android:dividerHeight="1dp"
android:visibility="gone">
</ListView>
</FrameLayout>
</RelativeLayout>
代碼片段10.2.5 收藏界面xml
注意,因爲爲了之後的歷史功能的方便,我在這裏也將歷史的功能界面加了進去。但是功能現在不實現。
注意我修改了ListView的分割線效果,將他的顏色修改爲了“E2E2E2”,高度爲2dp。兩個ListView一個隱藏,一個顯示,爲了進行歷史和收藏的切換。
現在我們可以看看它的預覽效果:
圖10.2.3 收藏界面效果圖
因爲是新建立的Acitivity,我們需要在主配置文件中添加註冊信息。
<activity
android:name="com.example.androidstudy_web.FavAndHisActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:label="@string/app_name"
></activity>
代碼片段10.2.6 註冊信息
現在定義一個單項的佈局:
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
/>
<TextView
android:id="@+id/item_name"
android:layout_width="match_parent"
android:layout_height="20dp"
android:textColor="@android:color/black"
android:textSize="16sp"
android:layout_marginLeft="15dp"
android:layout_marginTop="5dp"
/>
<TextView
android:id="@+id/item_url"
android:layout_width="match_parent"
android:layout_height="18dp"
android:textColor="#E2E2E2"
android:textSize="13sp"
android:layout_marginLeft="15dp"
android:layout_marginBottom="5dp"
/>
</LinearLayout>
代碼片段10.2.7 ListView單項item的佈局
這個因爲看不出來具體的佈局預覽,所以也就不放上去了。
我們必須傳入一個id的值,用來更好的進行查詢或者排序。
現在顯示也已經完成了,我們可以來看看現在的顯示效果。
圖10.2.4 具體機子的運行效果
可以看到,我們從數據庫中很容易的查詢到了所需要的。
好了,現在我們可以看下,該如何實現上述的顯示效果了:
/**
* 初始化ListView中的數據
* */
@SuppressWarnings("deprecation")
private void initData(Bundle savedInstanceState) {
//獲取書籤管理
this.favoritesManager =new FavoritesManager(this);
this.favoritesCursor =this.favoritesManager.getAllFavorites();
this.favorietesAdapter =new
SimpleCursorAdapter(getApplicationContext(),
R.layout.list_item,this.favoritesCursor,
new String[]{"_id","name","url"},
new int[]{R.id.item_id, R.id.item_name,R.id.item_url});
this.favoritesContent.setAdapter(this.favorietesAdapter);
}
代碼片段10.2.8 數據ListView的加載
這樣,很容易就加載了數據,不過需要注意的是,Cursor的關閉,雖然Android操作系統有時候也會幫助關閉,不過它仍舊建議我們手動關閉。
@Override
protected void onDestroy() {
if (this.favoritesCursor !=null) {
this.favoritesCursor.close();
}
super.onDestroy();
}
代碼片段10.2.9 關閉Cursor
至於如何關閉Cursor,上述的代碼就是過程,只需要在關閉這個Activity的過程中關閉cursor就可以了,否則可能會出現cursor已關閉的錯誤。
好了,展示跟添加的操作已經完成了,接下來就是書籤的修改和刪除的操作了。至於像UC中的同步之類的,這個就不涉及了。
最開始的自然還是界面了,這個是毋庸置疑的。我選擇了popupwindow作爲彈出菜單,每次長按ListView中的單個條目,都會跳出一個popupwindow,這個彈窗擁有兩個操作,一個是修改,一個是刪除,每次點擊的時候都會
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/item_longclicked_modifyFavorites"
android:layout_width="match_parent"
android:layout_height="20dp"
android:textColor="@android:color/white"
android:textSize="16sp"
android:text="@string/modifyfavorites"
android:layout_marginLeft="15dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="5dp"
/>
<TextView
android:id="@+id/item_longclicked_deleteFavorites"
android:layout_width="match_parent"
android:layout_height="20dp"
android:textColor="@android:color/white"
android:textSize="16sp"
android:text="@string/deletefavorites"
android:layout_marginLeft="15dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="5dp"
/>
</LinearLayout>
代碼片段10.2.10 彈出popupwindow的佈局
這個界面的預覽我們可以看一下:
圖10.2.5 彈出popupwindow的預覽
或許會感到不對勁,這些都沒什麼關係,這個只是大體的佈局,並不設置背景,因爲這裏如果直接設置背景,那麼在實際過程中很難實現背景的圓角效果。我用的是java中設置。
首先,要設置圓角效果,先要設置圓角的背景:
<?xmlversion="1.0"encoding="utf-8"?>
<layer-listxmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shapeandroid:shape="rectangle">
<solidandroid:color="#504E5A"/>
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"/>
</shape>
</item>
</layer-list>
代碼片段10.2.11 圓角背景
好了,基礎工作已經做完了,那麼接下來就是實現長按的事件了:
/**
* 長按單項事件
* 覆蓋如下方法
* 1. onItemLongClick
* */
private class ListViewOnItemLongListener implements OnItemLongClickListener{
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, intposition, long id) {
Log.d(DEG_TAG,"long itemcliced");
if(parent.getId()==R.id.favoritesAndHisotry_content_favorite){
ItemLongClickedPopWindowitemLongClickedPopWindow = new ItemLongClickedPopWindow(FavAndHisActivity.this, 200, 200);
itemLongClickedPopWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.favandhis_activity));
itemLongClickedPopWindow.showAsDropDown(view,view.getWidth()/2, -view.getHeight()/2);
}else if(parent.getId()==R.id.favoritesAndHisotry_content_history){
}
return false;
}
}
代碼片段10.2.12 長按事件的實現
注意這裏的最後setBackgroundDrawable,這個就是設置背景圓角,好了,這樣我們可以看看效果了,爲了可以看出是不同條目,跳出的不同位置,我截圖兩張圖片:
圖10.2.6 彈出的不同情況
開始完善功能,第一個要做的就是修改書籤。
修改書籤就要彈出一個修改窗口,這裏我是用的是AlertDialog的重新構建的方法。
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:background="@android:color/white"
android:orientation="vertical">
<LinearLayout
android:id="@+id/dialog_name"
android:layout_width="match_parent"
android:layout_height="30dp"
android:orientation="horizontal"
android:layout_marginTop="30dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/dialog_back"
>
<TextView
android:id="@+id/dialog_name_title"
android:layout_width="50dp"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="15sp"
android:text="@string/name"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
/>
<EditText
android:id="@+id/dialog_name_input"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/blank"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="@null"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/dialog_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="30dp"
android:background="@drawable/dialog_back"
>
<TextView
android:id="@+id/dialog_url_title"
android:layout_width="50dp"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="15sp"
android:text="@string/url"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
/>
<EditText
android:id="@+id/dialog_url_input"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="@string/blank"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:inputType="textUri"
android:background="@null"
/>
</LinearLayout>
</LinearLayout>
代碼片段10.2.13 對話框佈局
這裏我分成兩個文本域,我們可以看下顯示效果:
圖10.2.7 對話框佈局預覽
我們將長按事件修改如下:
/**
* 長按單項事件
* 覆蓋如下方法
* 1. onItemLongClick
* */
private class ListViewOnItemLongListener implements OnItemLongClickListener{
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position,long id) {
Log.d(DEG_TAG,"long itemcliced");
if(parent.getId()==R.id.favoritesAndHisotry_content_favorite){
itemLongClickedPopWindow =new ItemLongClickedPopWindow(FavAndHisActivity.this, 200, 200);
itemLongClickedPopWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.favandhis_activity));
itemLongClickedPopWindow.showAsDropDown(view, view.getWidth()/2, -view.getHeight()/2);
TextView modifyFavorite = (TextView) itemLongClickedPopWindow.getView(R.id.item_longclicked_modifyFavorites);
TextView deleteFavorite = (TextView) itemLongClickedPopWindow.getView(R.id.item_longclicked_deleteFavorites);
ItemClickedListener itemClickedListener = newItemClickedListener(view);
modifyFavorite.setOnClickListener(itemClickedListener);
deleteFavorite.setOnClickListener(itemClickedListener);
}else if(parent.getId()==R.id.favoritesAndHisotry_content_history){
}
return false;
}
}
代碼片段10.2.14 長按事件修改
注意他增加了一個popupwindow的組件尋找,通過觸發兩個TextView來進行增加刪除操作。
而需要注意的是我們需要構建一個實現了OnClickedListener的類,用來處理傳遞過來的事件,而且因爲需要用到一些ListView條目的值關係,所以必須將條目的view傳遞給事件處理類。
下面是事件處理類的具體實現
/**
* popupwindow按鈕事件處理類
* @param view 傳入的ListView條目
* 用來獲取其中的id、name、url這三個值
* 覆蓋如下方法:
* 1. onClick
* */
private class ItemClickedListener implements OnClickListener{
private Stringitem_id;
private Stringitem_name;
private Stringitem_url;
public ItemClickedListener(View item){
this.item_id = ((TextView) item.findViewById(R.id.item_id)).getText().toString();
this.item_name = ((TextView) item.findViewById(R.id.item_name)).getText().toString();
this.item_url = ((TextView) item.findViewById(R.id.item_url)).getText().toString();
}
@Override
public void onClick(View view) {
//取消彈窗
itemLongClickedPopWindow.dismiss();
if(view.getId()==R.id.item_longclicked_modifyFavorites){
//彈出修改窗口
LayoutInflater modifyFavoritesInflater = LayoutInflater.from(FavAndHisActivity.this);
View modifyFavoritesView =modifyFavoritesInflater.inflate(R.layout.dialog_modify,null);
final TextView item_name_input = (TextView)modifyFavoritesView.findViewById(R.id.dialog_name_input);
final TextView item_url_input = (TextView)modifyFavoritesView.findViewById(R.id.dialog_url_input);
item_name_input.setText(item_name);
item_url_input.setText(item_url);
new AlertDialog.Builder(FavAndHisActivity.this)
.setTitle("編輯書籤")
.setView(modifyFavoritesView)
.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog, int which) {
Log.d(DEG_TAG,"id:"+item_id+",name:"+item_name+",url:"+item_url);
if(favoritesManager.modifyFavorite(item_id, item_name_input.getText().toString(),
item_url_input.getText().toString())){
Toast.makeText(FavAndHisActivity.this,"修改成功", Gravity.BOTTOM).show();
initData();
favoritesContent.invalidate();
}else{
Toast.makeText(FavAndHisActivity.this,"修改失敗", Gravity.BOTTOM).show();
}
}
}).setNegativeButton("取消",null)
.create()
.show();
}else if(view.getId()==R.id.item_longclicked_deleteFavorites){
new AlertDialog.Builder(FavAndHisActivity.this)
.setTitle("刪除書籤")
.setMessage("是否要刪除\""+item_name+"\"這個書籤?")
.setPositiveButton("刪除",new DialogInterface.OnClickListener() {
@Override
publicvoid onClick(DialogInterface dialog, int which) {
if(favoritesManager.deleteFavorite(item_id)){
//刪除成功
Toast.makeText(FavAndHisActivity.this,"刪除成功", Gravity.BOTTOM).show();
initData();
favoritesContent.invalidate();
}else{
Toast.makeText(FavAndHisActivity.this,"刪除失敗", Gravity.BOTTOM).show();
}
}
})
.setNegativeButton("取消",null)
.create()
.show();
}
}
}
代碼片段10.2.15 popupwindow的按鈕處理事件的具體實現
可以看到我這裏通過傳遞過來的ListView的條目View獲取到三個量的TextView從而得到三個量的具體值。而取得了這三個值,那麼就可以通過書籤的事務管理類來進行相關的事務操作。
書籤的功能已經完成。
8.26
補充:並未添加書籤點擊載入的功能
因爲需要點擊返回一個字符串的URL值,所以需要使用startActivityForResult的函數。改動如下:
startActivityForResult(new Intent(MainActivity.this,FavAndHisActivity.class),0);
代碼片段10.2.15 開啓activity修改
注意,第二個參數爲一個請求碼,用來區分返回結果。並且需要複寫onActivtiyResult函數:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode){
case 0:
webHolder.loadUrl(data.getStringExtra("url"));
}
}
代碼片段10.2.16 返回結果處理
這種返回處理其實類似於函數的回調功能。這裏可以根據請求碼結果碼來區分進行相應的處理,我們這裏比較簡單,所以不管請求碼還是結果碼都爲0,處理的操作就是將返回過來的url值進行webView的加載處理。
好了,父Actvitiy已經處理完畢,那麼現在可以進行子Activity的處理,這個處理其實就是在適當的時候傳入返回結果就行了。
/**
* ListView單擊單項事件
* 覆蓋如下方法
* 1. onClick
* */
private class ListViewOnItemClickedListener implementsOnItemClickListener{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
if(arg0.getId()==R.id.favoritesAndHisotry_content_favorite){
Intent intent = new Intent();
intent.putExtra("url", ((TextView) arg1.findViewById(R.id.item_url)).getText().toString());
setResult(0, intent);
finish();
}
}
}
代碼片段10.2.17 實現ListView的單項單擊方法
注意,因爲我們是通過單擊ListView的條目來實現的,所以在單擊的同時,將需要返回的url的值設置到result中,並且調用finish。
這裏還需要特別注意的是,我們雖然在onDestory的方法中關閉了Cursor,但是如果通過finish來調用返回的話,那麼實際上Cursor並沒有關閉,所以,我們還需要重寫finish的方法:
@Override
public void finish() {
if (this.favoritesCursor != null) {
this.favoritesCursor.close();
}
super.finish();
}
代碼片段10.2.18 finish方法覆寫
這樣的話,那麼就沒問題了。當我們單擊的時候,書籤會返回給WebView載入URL。
至此,補充完成。
源代碼:
AndroidStudy_web_V2.0_bydddd牛仔
注意:轉載請註明出處