Android網絡:開發瀏覽器(二)——功能完善之書籤功能

經過上述的編寫,基本的功能已經完成了,不過工具欄裏面基本還是一片空白,只有一個刷新的功能,現在咱們就先完善這些功能(之前有朋友說來點圖,那麼這次我會截些圖更好的來描述)。

 

既然是瀏覽器,怎麼能沒有書籤的功能,爲了操作方便,我就將添加的書籤放在地址欄的旁邊,我比較喜歡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條目

    *     用來獲取其中的idnameurl這三個值

    * 覆蓋如下方法:

    * 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牛仔


    注意:轉載請註明出處


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章