2013-05-14 20 views
7

Tôi đang tạo một ứng dụng cho Android 4.0 trở lên và tôi muốn đạt được hành vi này. Hai hoạt động khác nhau sẽ có hai biểu tượng trình chạy khi thiết bị của người dùng là điện thoại và sẽ chỉ là một (hoạt động sẽ bao gồm các đoạn mà tôi sẽ hiển thị dưới dạng tab trong một hoạt động chính) trên thiết bị máy tính bảng. Tôi biết rằng một trong những có thể thiết lập nhiều hoạt động phóng trong manifest, nhưng tôi nghĩ rằng có lẽ tôi sẽ cần một cái gì đó mà sẽ xác định hoạt động này trong thời gian chạy (trong mã java).Hai hoạt động phóng trên điện thoại, một trên máy tính bảng

Trả lời

0

Bạn sẽ cần phải thực hiện nhiều apks, một cho tab và một cho điện thoại, sự khác biệt duy nhất sẽ là tệp kê khai trong các apks. Phần còn lại bạn có thể quản lý bằng mã.

0

Tại sao phải chịu nhiều đau đớn? Chỉ cần đi về thiết kế các ứng dụng riêng biệt cho điện thoại và máy tính bảng (đảm bảo chúng có cùng tên gói). Multiple APKs là những gì bạn nên tìm kiếm:

Although we encourage you to develop and publish a single APK that supports as many device 
configurations as possible, doing so is sometimes not possible. To help you publish your 
application for as many devices as possible, Google Play allows you to publish multiple 
APKs under the same application listing. Google Play then supplies each APK to the 
appropriate devices based on configuration support you've declared in the manifest file of 
each APK. 

Dưới đây là một liên kết: http://developer.android.com/google/play/publishing/multiple-apks.html

+0

tôi đã bắt đầu phát triển ứng dụng của tôi với một gói ứng dụng duy nhất cho cả điện thoại và máy tính bảng. Logic ứng dụng lỗ của tôi dựa trên đó. Bây giờ tôi cần thêm hoạt động mới, với hành vi này. Vì vậy, tôi cần sth có thể làm cho hoạt động của tôi - hoạt động phóng trong mã: s – Sandra

+0

chỉ sử dụng một trình khởi chạy hoạt động và trong onCreate trước khi setContent chỉ kiểm tra xem thiết bị là điện thoại hay máy tính bảng (bằng cách tính kích thước màn hình). Sau đó, đặt xml mong muốn làm nội dung cho hoạt động. –

+0

Thx cho gợi ý, nhưng tôi đã sử dụng nó trong ứng dụng của tôi. Bây giờ tôi cần hiển thị một đoạn như một tab trên máy tính bảng và được đóng gói trong hoạt động phóng riêng biệt trên điện thoại. Tôi nghĩ rằng phải có một cách để làm điều này. – Sandra

12

Hai hoạt động khác nhau sẽ có hai biểu tượng phóng khi thiết bị của người dùng là một chiếc điện thoại, và nó sẽ chỉ là một (các hoạt động sẽ bao gồm các đoạn mà tôi sẽ hiển thị dưới dạng tab trong một hoạt động chính) trên thiết bị máy tính bảng.

Không có khái niệm nào trong Android về "điện thoại" và "máy tính bảng". Tôi sẽ giả định rằng bạn đang phân biệt giữa "điện thoại" và "máy tính bảng" về kích thước màn hình.

Nếu đó là sự thật:

BướC# 1: Tạo một file res/values/bools.xml và xác định hai <bool> nguồn lực, is_phoneis_tablet. Có is_phonetrueis_tabletfalse.

BướC# 2: Tạo một file res/values-.../bools.xml, nơi ... là bất cứ điều gì vòng loại bạn đang sử dụng với cách bài trí của bạn để phân biệt giữa "điện thoại" và "máy tính bảng" (ví dụ, -large, -xlarge, -swNNNdp). Xác định hai tài nguyên <bool> cùng có giá trị ngược lại (ví dụ: is_phonefalse, is_tablettrue).

BướC# 3: Thêm cả hai hoạt động vào tệp kê khai của bạn, mỗi hoạt động được thiết lập cho MAIN/LAUNCHER<intent-filter>. Trên thiết bị bạn muốn sử dụng trên "điện thoại", hãy thêm android:enabled="@bool/is_phone" vào phần tử <activity>. Trên trang bạn muốn sử dụng trên "máy tính bảng", hãy thêm android:enabled="@bool/is_tablet" vào phần tử <activity>.

Bằng cách này, dựa trên các quy tắc tương tự mà bạn đang sử dụng cho bố cục của mình, bạn sẽ có một hoạt động trình chạy khác.


Rõ ràng, điều này không hiệu quả, mặc dù tôi thề là nó đã từng sử dụng.

Một tùy chọn khác là có một hoạt động là MAIN/LAUNCHER. Thiết lập nó với android:theme="@style/Theme.NoDisplay", vì vậy nó không có giao diện người dùng. Nó có đưa ra quyết định, trong Java, trong onCreate(), trong đó các hoạt động nhập cảnh "thực" của bạn phù hợp với kích thước màn hình đã cho, có thể sử dụng cùng một tài nguyên bool tôi đã trích dẫn ở trên.Sau đó, hãy gọi số startActivity() để chuyển quyền kiểm soát sang hoạt động chính xác gọi finish() trên chính nó (để người dùng không gặp phải hoạt động vô hình trên ngăn xếp BACK). Kỹ thuật này cũng được sử dụng trong các trường hợp không có cách nào để kiểm soát điều này thông qua tệp kê khai, chẳng hạn như "chúng tôi có Maps V1 hay không" nơi bạn có android:required="false" trên phần tử <uses-library>.

+0

Điều đó có vẻ giống như một giải pháp thú vị. Tôi không biết về thuộc tính 'đã bật' có thể được thiết lập trong tệp kê khai cho hoạt động. Tôi chắc chắn sẽ thử điều này. Cảm ơn! – Sandra

+0

Tôi đã làm như bạn gợi ý, nhưng sth không làm việc cho tôi. Do hành vi được đề cập ở trên mà tôi muốn đạt được, tôi đã thiết lập hai tài nguyên trong các tệp bools.xml (bools.xml trong res/values ​​và bools.xml trong res/values-sw600dp) => main_activity_enabled (true in res/giá trị và true trong res/values-sw600dp), second_activity_enabled (true trong res/values ​​và false trong res/values-sw600dp). Từ đây tôi chỉ nên có MainActivity là launcher trên thiết bị máy tính bảng, nhưng mặc dù tôi có hai bệ phóng: S – Sandra

+0

@Sandra: Bạn cần 'main_activity_enabled' là' false' trong một trong các trường hợp của bạn - bạn yêu cầu nó là ' true' trong cả hai. – CommonsWare

0

Tôi có thể đang đánh bại một con ngựa chết ở đây, nhưng còn cách sử dụng bí danh bố cục thì sao?

Use Layout Aliases

1

On khởi động đầu tiên của ứng dụng của bạn, bạn có thể lập trình kiểm tra xem thiết bị của bạn là một chiếc tablet hoặc điện thoại. Nếu đó là điện thoại, bạn có thể thêm phím tắt vào màn hình chính theo chương trình và chỉ định Intent mà trình khởi chạy sẽ sử dụng để truy cập Hoạt động chính xác.

Trước tiên, trong Tệp kê khai, bạn sẽ chỉ có một trình chạy, nhưng bạn sẽ có một Hoạt động không có bộ lọc ý định sẽ được mở từ phím tắt được tạo theo chương trình.

Tiếp theo, trong Trình khởi chạy của hoạt động trênTạo, hãy kiểm tra xem bạn đã tạo lối tắt chưa. Từ những gì tôi đã đọc, cách tốt nhất để làm điều này là sử dụng một giá trị boolean trong SharedPreferences:

SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE); 
if (!prefs.getBoolean("shortcut", false)) { 
    if (!isTablet(this)) { 
     createShortcut(); 
    } 
    prefs.edit().putBoolean("shortcut", true).commit(); 
} 
else { 
    //if the shortcut has already been made, see if that is what was used to open this app 
    if (getIntent() != null) { 
     if (getIntent().getBooleanExtra("shortcut", false)) { 
      //the shortcut was used, so open the other Activity: 
      Intent shortcut = new Intent(this, OtherActivity.class); 
      startActivity(shortcut); 
     } 
    } 
} 

Tiếp theo, bạn cần xác định những gì bạn gọi một máy tính bảng. Điều này được dựa trên các điểm ảnh độc lập với mật độ của màn hình. Ví dụ, để gọi các thiết bị với máy tính bảng màn hình 7-inch, con số này là 600. Đối với thiết bị lớn hơn - như một màn hình 10-inch, con số này là 720. Lưu số này trong một biến:

private static final int TABLET_DP = 600; 

Sau đó, thêm các phương thức sử dụng trên:

public static boolean isTablet(Context context) { 
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\ 
    Display display = wm.getDefaultDisplay(); 
    DisplayMetrics outMetrics = new DisplayMetrics(); 
    display.getMetrics(outMetrics); 
    float density = context.getResources().getDisplayMetrics().density; 
    float dpWidth = outMetrics.widthPixels/density; 
    return dpWidth >= TABLET_DP; 
} 

private void createShortcut() { 

    //this is the intent that will be used when the shortcut is clicked. 
    Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); 
    shortcutIntent.setClassName(this, this.getClass().getName()); 
    shortcutIntent.putExtra("shortcut", true); 

    //this is the intent used to create the shortcut. 
    Intent intent = new Intent(); 
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));//or however you want the shortcut to be labeled. 
    Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
      this, R.drawable.ic_launcher);//or whatever you want the icon to be 
    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); 
    intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); 

    //tell Android to create the shortcut 
    context.sendBroadcast(intent); 
} 

Cuối cùng, hãy chắc chắn bạn có quyền đúng để cài đặt phím tắt:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"></uses-permission> 
Các vấn đề liên quan