2013-05-21 7 views
10

범용 앱을 개발하고 싶습니다. 나는이 접근 방식의 초심자이다. 그것은 태블릿과 전화 응용 프로그램을위한 단일 apk를 의미한다. 나는Android Universal App Approach

Support Library

Fragments

내 목표는 하나의 APK 내부에 다른 태블릿에 대한 UI와 전화를 구축하는 것입니다 통과했다.

나는 Getting Your App Ready for Jelly Bean and Nexus 7을 읽을 수 있었다. 이 문서에서는

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 

우리가 다른 장치에 대한 다른 레이아웃을 사용할 수 있다는 것을 의미 그 언급. 이것은 나에게 혼란을

EDIT 1 :

한다고 가정 시나리오

if my phone UI layout contains one-view pager and 

tablet UI layout contain two-view pager . 

우리가 이것을 어떻게 달성 할 수 있습니까 ?? 이 기사에서는 다른 화면의 동일한 이름을 가진 다른 레이아웃을 지정하고 해당 폴더를 유지한다고 설명합니다. 그러나 앱에서 전화를 실행할 때 태블릿 레이아웃의 위젯 구성 요소를 초기화하려고하면 예외가 발생합니다.

편집 2 : 아이디어는 내 마음에 와서 내가 즉, 탭 또는 전화를 사용하고 있습니다 장치의 유형을 결정합니다. 응용 프로그램은 전화 인 경우

Determine if the device is a smartphone or tablet?

그런 다음 위젯의 초기화를 피할 수 있습니다. 이보다 더 좋은 방법이 있습니까 ??

편집 3 : 더 높은 버전의 태블릿에 대한 내 레이아웃 만약

-2.3에서 내 응용 프로그램 지원 전화 내가 초기화 괜찮나 레이아웃과 사용에 비해 추가 위젯을 보유하고 있습니다. 희망은 모두 내 필요를 이해했습니다. 그럼 내 의심을 명확히하시기 바랍니다

+0

는 ** 그게 우리가 다른 장치에 대한 다른 레이아웃을 사용할 수 있다는 것을 의미합니다. 이것은 나를 혼란스럽게합니다. ** 무엇이 당신을 혼란스럽게합니까? 이미 많은 연구를 해왔다고 생각합니다. –

+0

필자는 레이아웃/대형 (5.1-7 인치 디바이스 용), 레이아웃/xlarge (10 인치 탭 용) 및 모바일 용 레이아웃 표준을 사용하는 것이 바람직합니다. 모바일 레이아웃은 더욱 레이아웃/대형 xhdpi를 사용하여 정의 할 수 있습니다 또는 LDPI/MDPI/hdpi에 –

+0

@FahadIshaque 내 편집을 확인하시기 바랍니다 – edwin

답변

6

.

res/layout 
res/layout-sw600dp 

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

당신은 마진과 패딩 및 기타 리소스를 지정 만 하나의 레이아웃 디렉토리와 두 값 디렉토리가있는 것으로 나타났습니다, 값 및 기타 리소스를 구별한다. 따라서 단일 레이아웃은 7 인치와 10 인치 태블릿에도 사용할 수 있습니다. 이것은 나의 시나리오입니다. layout-sw720dp을 정의 할 수도 있습니다. 나는 레이아웃의 컴파일 시간을 줄이기 위해 그렇게했다.

나는 전화와 태블릿에서 또 다른 레이아웃을 가지고있다.예를 들어, 나는 사용자가 항목을 클릭 할 때 다음, 그것은 다른 활동을 열, 첫 번째 화면에서 ListView에을 가지고 DetailView 그것에 대해 있다. 그러나 태블릿에, 나는 측면 ListView를과 오른쪽의 DetailView을 떠났다. 그래서

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

및 태블릿 값-sw600dp에 대한 동일/문자열

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

, 내가 다음 코드와 장소 값/문자열에서, 이렇게,에 와서 코딩의 일부. 나는 스플래시 화면을 가지고 있으며 일반적인 레이아웃을 가지고 있습니다. 그러면 일반 화면이 표시됩니다. 그러나 사용자가 아무 버튼이나 클릭하면 태블릿인지 여부를 확인합니다. ,

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

그것을 확인하려면 이제 깃발이 응용 프로그램 전화 또는 태블릿에서 실행되고 있는지 여부를 나타냅니다.

내가

com.phone 
com.tablet 

다음 플래그에 따라, 나는 전화 패키지와 태블릿 패키지에 내 활동을 직접 두 패키지를 만들었습니다.

예,

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

그리고이 방법은 내 문제를 해결했다.

+0

하나의 기능을 위해 두 개의 레이아웃 핸들러 클래스를 사용하라고합니다. – edwin

+0

화면이 다른 경우 기능이 달라집니다. 내 친구. 기능이 동일하다면 조각을 위해 가라. 그러면 문제가 해결되지만, 전화기와 태블릿 모두 다른 화면 디자인에 문제가 있지만이 방법을 사용한다. –

+0

@edwin, 아직 해결되지 않은 문제입니까? –

1

findViewById 위젯이없는 경우를 대비하여 null 위젯이 레이아웃에있을 경우를 반환합니다. 따라서 null이 아닌 값을 반환하면 추가 초기화를 진행할 수 있습니다. 나는이 문제에 직면 할 때, 나는 구조 다음 만들

+0

나는 그들이 때때로 이런 식으로 할 본 적이 – edwin

+0

내 EDIT2 확인할 수 있습니다 : 당신이 특정 레이아웃을 알고있는 경우를 다른 레이아웃보다 위젯이 많으면 '추가'그룹의 단일 위젯이 있는지 확인할 수 있습니다. findViewById가 null이 아닌 경우 나머지 모든 위젯도 가질 수 있습니다. –