2012-10-08 21 views
8

Khi bạn làm startActivity() với trình chọn, Android sẽ liệt kê tất cả các ứng dụng có quyền xử lý Intent cùng với các tùy chọn để đặt nhiệm vụ này vĩnh viễn hoặc một lần (trên ICS của nó) "và" Chỉ một lần "nút tác vụ, trên hộp kiểm 2.x của nó). Tuy nhiên đối với mã này:Không thể thực hiện startActivity() với Trình chọn chỉ yêu cầu một lần cho mỗi ứng dụng

public class Redirector { 
    public static void showActivityWithChooser(Context context, int chooserLabelTitleId, Intent intent) { 
     try { 
     context.startActivity(Intent.createChooser(intent, 
        context.getResources().getString(chooserLabelTitleId))); 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 

    public static void viewInExternalApplication(Context context, String url) { 
     Intent intent = new Intent( Intent.ACTION_VIEW); 
     intent.setData(Uri.parse(url)); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
     showActivityWithChooser(context, R.string.open_chooser_title, intent); 
    } 
} 

Tôi thấy không có | nút "Luôn Chỉ một lần" và không thể đưa ra lựa chọn của tôi vĩnh viễn (tôi đã ứng dụng được liệt kê chỉ và có thể bắn bất kỳ bằng cách khai thác nó). Những gì tiểu học tôi bỏ qua mà làm cho Android không thể làm cho sự lựa chọn của người dùng liên tục?

Xem các bức ảnh: left thoại là những gì tôi muốn nhìn thấy, nhưng đúng là những gì tôi có được bây giờ (số lượng khác nhau của các ứng dụng trong cả hai hộp thoại là không thích hợp):

enter image description here

+0

'Luôn luôn' có nghĩa là thực hiện lựa chọn vĩnh viễn. Ứng dụng của bạn không có cách nào để điều khiển hộp thoại này, một phần của Android trực tiếp. – mah

+0

@mah: Bạn đã bỏ lỡ điểm. –

+1

Thật vậy, tôi đã làm. Tuy nhiên, nửa sau của bình luận của tôi là viết tắt; đây không phải là hộp thoại bạn có thể kiểm soát từ ứng dụng của mình. Vấn đề là bạn đang gọi showActivityWithChooser, không nhằm cho phép người dùng thay đổi mặc định của họ mà thay vào đó là nhằm buộc người dùng phải chọn. – mah

Trả lời

16

Đối với một kỷ lục - đó là loại lỗi giải thích quá mức (của tôi). Các lựa chọn tôi đã sử dụng là chính xác những gì có thể được nhìn thấy trên hình ảnh ở phía bên phải. Và nó luôn luôn hiển thị bởi vì ... tôi luôn gọi nó. Tôi đã giả định không chính xác rằng trình chọn cung cấp chức năng "Luôn luôn | Chỉ một lần" và sẽ không hiển thị nếu người dùng nhấn "Luôn luôn" (và sẽ hiển thị nếu người đó đã sử dụng "Chỉ một lần"). Nhưng nó là sai. Trình chọn sẽ hiển thị luôn luôn vì đó là vai trò của nó - để cho phép người dùng chọn. Chức năng "Luôn luôn | Chỉ một lần" là điều khác biệt - đó là tính năng của khung công tác Android cho các cuộc gọi startActivity()startActivityForResult() và sẽ tự động hiển thị khi cần - nếu có nhiều ứng dụng (hoặc chính xác, nhiều hơn một kết hợp intent-filter) có thể xử lý Intent nhất định. Nó sẽ không hiển thị nếu bạn chỉ có một (hoặc người dùng trước đó khai thác "Luôn luôn"). Bạn, là nhà phát triển không cần phải quan tâm.

Vì vậy, để khắc phục điều này, tôi chỉ thay đổi mã viewInExternalApplication() của tôi để làm cho nó chỉ cần gọi startActivity():

try { 
    context.startActivity(intent); 
} catch (....) 

và để cho khuôn khổ làm phần còn lại.

+1

Chính xác những gì tôi muốn hiểu! 10x – WindRider

Các vấn đề liên quan