2016-11-01 21 views
16

Có thể định nghĩa các phím tắt tĩnh cho nhiều vị trí mà không cần sao chép shortcuts.xml không? Tôi có hai hương vị:Phím tắt cho Android có nhiều hương vị?

  • chính (gói: com.test)
  • miễn phí (gói: com.test.free)

Các shortcuts.xml trông như thế này:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 
<shortcut 
    android:enabled="true" 
    android:icon="@drawable/ic_shortcut_add_photo" 
    android:shortcutId="new_photo" 
    android:shortcutLongLabel="@string/new_photo" 
    android:shortcutShortLabel="@string/new_photo"> 

    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetClass="com.test.MainActivity" 
     android:targetPackage="com.test"/> 
</shortcut> 

Vấn đề là tên gói trong inten t không thể tham chiếu đến tài nguyên chuỗi và phải được mã hoá cứng trong xml.

Để cũng cung cấp các phím tắt cho các hương vị tự do tôi phải sao chép các shortcuts.xml và thay đổi targetPackage để com.test.free mà là một giải pháp xấu.

+0

"Sự cố là tên gói trong mục đích không thể tham chiếu đến tài nguyên chuỗi và phải được mã hóa cứng trong xml" - Tôi không ngạc nhiên và đó thực sự là vấn đề. "Để cung cấp các phím tắt cho hương vị tự do, tôi phải sao chép shortcuts.xml và thay đổi targetPackage thành com.test.miễn phí mà là một giải pháp xấu "- bạn có thể tìm thấy một số plugin Gradle hiện có sẽ cho phép bạn tạo mã từ một nguồn duy nhất. – CommonsWare

+1

@CommonsWare Điều đó nghe có vẻ như một giải pháp quá phức tạp cho một vấn đề phổ biến –

+0

Nó không phải là một Vấn đề rất phổ biến tại thời điểm này, trong khi các phím tắt ứng dụng đã tồn tại trong vòng hai tuần, bạn có thể là nhà phát triển thứ hai trên hành tinh, người đã phải lo lắng về vấn đề này. (ví dụ, XML ưu tiên), chúng dường như không được sử dụng nhiều, ngoài ra, những gì tôi đề xuất là khá nhiều tất cả các chuỗi công cụ có thể cung cấp cho bạn (ví dụ, nội suy chuỗi kiểu kết hợp khai báo) – CommonsWare

Trả lời

1

QUAN TRỌNG: Giải pháp này chỉ hoạt động đối với phiên bản plugin gradle android trước 3.0 do thay đổi về cách xử lý tài nguyên.

Vì vậy, chỉ cần nhấn vào vấn đề này ngay bây giờ vì hậu tố .debug trên id ứng dụng của chúng tôi để gỡ lỗi xây dựng. Đây là cách giải quyết của chúng tôi (lưu ý đây là một thích ứng chưa được kiểm tra từ codebase của chúng tôi):

src/main/res/shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 
<shortcut 
    android:enabled="true" 
    android:icon="@drawable/ic_shortcut_add_photo" 
    android:shortcutId="new_photo" 
    android:shortcutLongLabel="@string/new_photo" 
    android:shortcutShortLabel="@string/new_photo"> 

    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetClass="com.test.MainActivity" 
     android:targetPackage="@string/application_id"/> 
</shortcut> 

<android module name>/build.gradle:

apply plugin: 'com.android.application' 

//region: Fix shortcuts.xml by manually replacing @string/application_id 

final String APPLICATION_ID_STRING_RES_KEY = "application_id" 

android.applicationVariants.all { variant -> 

    // Add the application id to the strings resources 
    // We do this so that in the future if google fixes the 
    // processing of the shortcuts.xml we can leave this 
    // and remove the `mergeResources.doLast` block below 
    resValue "string", APPLICATION_ID_STRING_RES_KEY, variant.applicationId 

    // Manually replace @string/application_id with `variant.applicationId` 
    variant.mergeResources.doLast { 
    println("variant = ${variant.applicationId}") 

    final File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/xml/shortcuts.xml") 
    final String content = valuesFile.getText('UTF-8') 
    final String updatedContent = content 
     .replace("@string/${APPLICATION_ID_STRING_RES_KEY}", variant.applicationId) 

    valuesFile.write(updatedContent, 'UTF-8') 
    } 
} 

//endregion 

android { 
    ... 
} 
+1

Cảm ơn câu trả lời, thật không may, tôi không nghĩ rằng nó hoạt động với Android Studio 3.0/AAPT2. Có vẻ như shortcuts.xml không tồn tại nữa trong thư mục build, và thay vào đó có xml_shortcuts.xml.flat, có vẻ như là một định dạng tệp khác mà tôi không thể dễ dàng tìm ra cách chỉnh sửa. – Jawnnypoo

+0

Xác nhận, sử dụng chuỗi res wil KHÔNG hoạt động với aapt2/plugin v3 – for3st

+0

Trả lời được cập nhật để phản ánh rằng giải pháp này không hoạt động với plugin android gradle v3 mới. Chưa tìm thấy giải pháp mới, sẽ cập nhật lại khi/nếu tôi làm. – Bulwinkel

1

Khi điều tra này, tôi đi qua thư viện này, mà dường như làm thủ thuật:

https://github.com/Zellius/android-shortcut-gradle-plugin

Nhược điểm: Bạn không thể có shortcuts.xml trong thư mục res của ứng dụng vì plugin sẽ thay đổi tệp để tự động thêm targetPackage và sau đó thả vào trong thời gian xây dựng và nếu bạn đã xác định sẽ gây ra lỗi tài nguyên trùng lặp.

Khác với nhược điểm đó, dường như hoạt động tốt!

2

Tôi tạo ra một plugin mà làm cho nó có thể sử dụng manifestPlaceholders tài nguyên và có thể sử dụng với phiên bản 3.0.0 của các plugin gradle android

https://github.com/timfreiheit/ResourcePlaceholdersPlugin

src// main res/shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> 
<shortcut 
    android:enabled="true" 
    android:icon="@drawable/ic_shortcut_add_photo" 
    android:shortcutId="new_photo" 
    android:shortcutLongLabel="@string/new_photo" 
    android:shortcutShortLabel="@string/new_photo"> 

    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetClass="com.test.MainActivity" 
     android:targetPackage="${applicationId}"/> 
</shortcut> 
+0

Điều này thực sự thực sự tốt và giải quyết vấn đề mà không cần hack, thx – for3st

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