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
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ã.
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
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_phone
và is_tablet
. Có is_phone
là true
và is_tablet
là false
.
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_phone
là false
, is_tablet
là true
).
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 và 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>
.
Đ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
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
@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
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?
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>
- 1. setTimeout không hoạt động trên điện thoại di động safari
- 2. Tính Pi trên điện thoại Android
- 3. Hình động và Điện thoại không hoạt động trên điện thoại di động
- 4. JS Dựa trên bàn phím ảo cho trình duyệt, như trên điện thoại di động và máy tính bảng
- 5. Các chức năng của máy ảnh Android không hoạt động trên một vài điện thoại
- 6. Quảng cáo trên điện thoại Windows không hoạt động
- 7. Tôi làm cách nào để gỡ lỗi Javascript hoạt động trên máy tính để bàn của mình nhưng không hoạt động trên điện thoại di động?
- 8. Đánh thức điện thoại/máy tính bảng Android?
- 9. Hai hoạt động phóng
- 10. Tôi làm cách nào để bố cục hoạt động trong cả Máy tính bảng và điện thoại?
- 11. Gmail Sync trên điện thoại Android
- 12. Làm cách nào để tắt di chuyển trong các trình duyệt trên điện thoại thông minh và máy tính bảng?
- 13. window.scrollTo không hoạt động trong điện thoại di động
- 14. Cách điện thoại thực sự hoạt động?
- 15. Xoay điện thoại khởi động lại video trên android
- 16. Cách kích hoạt cuộc gọi điện thoại khi nhấp vào liên kết trong trang web trên điện thoại di động
- 17. Hiệu năng GetImageData()/PutImageData() trên điện thoại di động
- 18. Sự cố với trang web trên điện thoại di động
- 19. Twitter Bootstrap: Menu thả xuống Di chuột cho Máy tính để bàn, Nhấp vào Máy tính bảng/Điện thoại?
- 20. Số hiển thị HTML trên điện thoại di động
- 21. Ứng dụng Android dành cho điện thoại và máy tính bảng: 1 hoặc 2 ứng dụng?
- 22. Nút bật/tắt trên điện thoại di động jQuery?
- 23. sự kiện nhấp chuột jquery cho máy tính bảng và điện thoại màn hình cảm ứng
- 24. vụ tai nạn điện thoại trên "resume"
- 25. Android AppWidget không hiển thị trên một số điện thoại
- 26. onCreateOptionsMenu không được gọi trên FragmentActivity khi chạy trên phiên bản điện thoại
- 27. PHP flush() dường như hoạt động trên máy Linux của tôi nhưng không hoạt động trên máy tính của tôi?
- 28. Phân biệt giữa các trình duyệt điện thoại và máy tính bảng
- 29. Phát video trên AVD bằng điện thoại
- 30. Gỡ lỗi trong trình duyệt trên điện thoại di động?
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
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. –
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