長按listview彈出選項列表對話框


Android中通過xml資源文件定義數組。來自微風的網絡日志。

文章鏈接:http://leybreeze.com/blog/?p=1524

Android ListView兩種長按彈出菜單方式

http://www.eoeandroid.com/thread-173294-1-1.html

完全自定義Android對話框AlertDialog的實現

在values目錄下創建arrays.xml文件。


Builder android.app.AlertDialog.Builder.setItems(int itemsId, OnClickListener listener)

Set a list of items to be displayed in the dialog as the content, you will be notified of the selected item via the supplied listener. This should be an array type i.e. R.array.foo

Returns: This Builder object to allow for chaining of calls to set methods


Activity實現接口AdapterView.OnItemLongClickListener。

listView設置Listener。

mListView.setOnItemLongClickListener(this);

Activity實現接口方法onItemLongClick。

public boolean onItemLongClick(AdapterView<?> parent, View view,
        int position, long id) {
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    TxrjThreads thread = mThreads.get(position);
    builder.setTitle(thread.getName());
    builder.setItems(R.array.thread_menu, new DialogInterface.OnClickListener() {
       
        @Override
        public void onClick(DialogInterface dialog, int which) {
           
        }
    });
    builder.show();
    return false;
}

在values/arrays.xml文件中定義thread_menu字符串數組。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="thread_menu">
        <item >Call</item>
        <item >Edit And Call</item>
        <item >Remove</item>
    </string-array>
</resources>

在代碼中獲取數組內容。

String[] sa = getResources().getStringArray(R.array.thread_menu);

如果是多選,那么就將代碼中藍色部分替換為以下代碼判斷。

boolean[] checkedItems = {true, false, true};
builder.setMultiChoiceItems(R.array.thread_menu, checkedItems,
        new DialogInterface.OnMultiChoiceClickListener() {
   
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    }
});

實現:撥號,撥號前編輯,刪除會話。

當刪除會話成功之后,contentObserver會觀察到數據發生變化,然后會自動更新UI。

builder.setItems(R.array.thread_menu, new DialogInterface.OnClickListener() {
   
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch(which){
        case TxrjConstant.MENU_THREAD_CALL:
            Intent itCall = new Intent(Intent.ACTION_CALL,
                    Uri.parse("tel:" + thread.getNumber()));

            startActivity(itCall);
            break;
        case TxrjConstant.MENU_THREAD_EDIT_AND_CALL:
            Intent itDial = new Intent(Intent.ACTION_DIAL,
                    Uri.parse("tel:" + thread.getNumber()));

            startActivity(itDial);
            break;
        case TxrjConstant.MENU_THREAD_REMOVE:
            getContentResolver().delete(Sms.CONTENT_URI,
                    "thread_id="+thread.getThreadId(), null);

            break;
        }
    }
});

撥號時出現錯誤,需要添加權限。
07-19 12:03:16.395: E/AndroidRuntime(5557): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxx cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{41744578 5557:com.txrj.sms/10110} (pid=5557, uid=10110) requires android.permission.CALL_PHONE

在Manifest.xml文件中添加授權即可。

<uses-permission android:name="android.permission.CALL_PHONE" />

在刪除會話之前需要確定一下,避免誤刪操作發生。

確認對話框使用自定義的ConfirmActivity。在跳轉之前設置message。

case TxrjConstant.MENU_THREAD_REMOVE:
    Intent itRemove = new Intent(mContext, ConfirmActivity.class);
    itRemove.putExtra("message", "delete conversation?");
    startActivityForResult(itRemove, TxrjConstant.REQUEST_REMOVE_THREAD);

    break;
}

在onActivityResult()方法中處理刪除操作。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == TxrjConstant.REQUEST_REMOVE_THREAD &&
            resultCode == RESULT_OK) {
        getContentResolver().delete(Sms.CONTENT_URI,
                "thread_id="+curThread.getThreadId(), null);
    }
}


將對話框標題居中,以及修改對話框編輯的背景顏色。

參考:自定義 Android 對話框 (AlertDialog) 的樣式

http://www.open-open.com/lib/view/open1325635738437.html

LYBUF7$VI_][4E$`5HLUBXT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM