zoukankan      html  css  js  c++  java
  • 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牛仔


        注意:转载请注明出处


  • 相关阅读:
    hdu 1166 敌兵布阵
    linux(debian)系统django配远程连接sqlserver数据库
    [机器学习] Coursera ML笔记
    UICollectionView使用方法补充(照片轮播墙)
    word中公式的排版及标题列表
    FZOJ2110: Star
    Windows 下的 Makefile 编写
    掌握VS2010调试 -- 入门指南
    Visual Studio 2010初学者的调试指南:Mastering Debugging in Visual Studio 2010
    AlphaGo:用机器学习技术古老的围棋游戏掌握AlphaGo: Mastering the ancient game of Go with Machine Learning
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3283311.html
Copyright © 2011-2022 走看看