2013-05-21 30 views
10

Tôi muốn phát triển một ứng dụng toàn cầu. Tôi là người mới làm quen với cách tiếp cận này. Có nghĩa là một gói ứng dụng duy nhất cho cả ứng dụng máy tính bảng và điện thoại. Tôi đã đi quaTiếp cận ứng dụng Android Universal

Support Library

Fragments

Mục tiêu của tôi là xây dựng giao diện người dùng khác nhau cho Tablet và điện thoại bên trong một gói ứng dụng duy nhất.

Tôi đã đọc Getting Your App Ready for Jelly Bean and Nexus 7. Bài viết này đề cập đến rằng

res/layout/activity_home.xml 

To take advantage of the extra space on the 7” screen you might provide an alternative layout: 

res/layout-sw600dp/activity_home.xml 

The sw600dp qualifier declares that these resources are for devices that have a screen with at least 600dp available on its smallest side. 

    Furthermore you might even provide a different layout for 10” tablets: 

res/layout-sw720dp/activity_home.xml 

Điều đó có nghĩa là chúng tôi có thể sử dụng bố cục khác nhau cho thiết bị khác nhau. Điều này confuses me

EDIT 1 :: Kịch bản

Giả sử

if my phone UI layout contains one-view pager and 

tablet UI layout contain two-view pager . 

Làm thế nào chúng ta có thể đạt được điều này ?? Trong bài này, nó nói rằng bạn có một cách bố trí khác với cùng tên cho màn hình khác nhau và giữ cho nó tương ứng với thư mục. Nhưng tôi nghi ngờ điều này sẽ phát sinh ngoại lệ nếu nó cố gắng khởi tạo thành phần widget của bố cục Tablet khi ứng dụng đang chạy trong điện thoại.

CHỈNH SỬA 2: Ý tưởng đi vào trong tâm trí của tôi là xác định loại thiết bị tôi đang sử dụng tức là Tab hoặc điện thoại.

Determine if the device is a smartphone or tablet?

Sau đó tránh khởi chạy tiện ích nếu ứng dụng là điện thoại. Có cách nào tốt hơn thế này không ??

EDIT 3: My hỗ trợ ứng dụng từ 2.3 đến phiên bản cao hơn

Nếu bố trí của tôi cho máy tính bảng chứa các widget thêm so với cách bố trí điện thoại .Làm thế nào một i khởi tạo và sử dụng. Hy vọng tất cả hiểu nhu cầu của tôi. Vì vậy, vui lòng làm rõ sự nghi ngờ của tôi

+0

** Điều đó có nghĩa là chúng tôi có thể sử dụng bố cục khác nhau cho thiết bị khác nhau. Điều này làm tôi bối rối. ** Điều gì làm bạn bối rối? Tôi nghĩ bạn đã thực hiện rất nhiều nghiên cứu rồi. –

+0

Tôi nên sử dụng bố trí/lớn (đối với thiết bị 5.1-7 inch), bố trí/xlarge (đối với các tab 10 inch) và bố trí bình thường cho điện thoại di động. Bố cục di động có thể được xác định thêm bằng cách sử dụng bố trí/lớn-xhdpi hoặc ldpi/mdpi/hdpi –

+0

@FahadIshaque Vui lòng kiểm tra chỉnh sửa của tôi – edwin

Trả lời

6

Khi tôi gặp sự cố, tôi tạo cấu trúc sau.

res/layout 
res/layout-sw600dp 

sau đó để phân biệt giá trị và các nguồn lực khác,

res/values 
res/values-sw600dp 
res/values-sw720dp 

Bạn nhận thấy rằng chỉ có một bố trí thư mục và hai giá trị thư mục để xác định lợi nhuận và miếng đệm và các nguồn lực khác. Vì vậy, bố trí duy nhất có thể được sử dụng cho máy tính bảng 7 "cũng như 10". Đây là kịch bản của tôi, bạn cũng có thể xác định layout-sw720dp. Tôi đã làm điều đó do giảm thời gian biên dịch của bố trí.

Tôi cũng có các bố cục khác nhau trong điện thoại và máy tính bảng.Ví dụ: tôi có ListView trong màn hình đầu tiên, sau đó khi người dùng nhấp vào mục, nó sẽ mở hoạt động khác và có DetailView cho điều đó. Nhưng trong máy tính bảng, tôi có bên trái ListView và bên phải Chi tiếtXem.

Vì vậy, để làm như vậy, trong giá trị/chuỗi, tôi đặt sau mã,

<bool name="isTablet">false</bool> 

và tương tự cho tablet giá trị-sw600dp/chuỗi

<bool name="isTablet">true</bool> 

Bây giờ, đến một phần của mã hóa. Tôi có một màn hình giật gân và có bố trí chung. Vì vậy, nó sẽ hiển thị màn hình chung. Nhưng khi người dùng nhấp vào nút bất kỳ, nó sẽ kiểm tra xem nó là máy tính bảng hay không. Để kiểm tra xem nó,

boolean isTablet = getResources().getBoolean(R.bool.isTablet); 

Bạn có bây giờ lá cờ cho biết ứng dụng của bạn đang chạy trên điện thoại hoặc tablet.

Tôi đã tạo ra hai gói,

com.phone 
com.tablet 

sau đó theo cờ, tôi chỉ đạo hoạt động của tôi để điện thoại gói và tablet gói.

Ví dụ,

if(isTablet) 
    startActivity(this,TabXYZ.class); 
else 
    startActivity(this,PhXYZ.class); 

Và phương pháp này đã giải quyết vấn đề của tôi.

+0

Vì vậy, bạn đang yêu cầu tôi sử dụng hai lớp trình xử lý bố cục cho một chức năng – edwin

+0

Nhưng chức năng đó sẽ khác nếu màn hình khác với bạn của tôi. Nếu chức năng là như nhau, sau đó đi cho mảnh, nó sẽ giải quyết vấn đề của bạn, nhưng mặc dù tôi có vấn đề với thiết kế màn hình khác nhau cho cả điện thoại và máy tính bảng, tôi sử dụng phương pháp này. –

+0

@edwin, vấn đề của bạn chưa được giải quyết chưa? –

1

findViewById sẽ trả lại tiện ích trong trường hợp nó có trong bố cục, null trong trường hợp không có tiện ích như vậy. Vì vậy, nếu nó trả về không null bạn có thể tiến hành khởi tạo thêm.

+0

Có thể kiểm tra EDIT2 – edwin

+0

Tôi đã nhìn thấy chúng đôi khi làm như thế này: nếu bạn biết rằng trên một bố cục nhất định bạn có nhiều tiện ích hơn bố cục khác, bạn chỉ có thể kiểm tra sự hiện diện của một tiện ích con từ nhóm 'bổ sung' đó. Nếu findViewById cung cấp cho non-null nó có nghĩa là bạn cũng sẽ có tất cả các phần còn lại của các widget phụ của bạn. –

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