[android] Android : 태블릿에 세로 및 가로를 허용하지만 휴대 전화에서 세로를 강제로 설정 하시겠습니까?
태블릿을 세로 및 가로 (sw600dp 이상)로 표시하고 싶지만 휴대 전화는 세로로만 제한됩니다. 조건부로 방향을 선택할 수있는 방법을 찾을 수 없습니다. 어떤 제안?
답변
다음은 resources 및 size 한정자를 사용하는 좋은 방법 입니다.
이 bool 리소스를 res / values에 bools.xml 또는 무엇이든 (파일 이름은 중요하지 않음)으로 넣으십시오.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>
이것을 res / values-sw600dp 및 res / values-xlarge에 넣으십시오.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
</resources>
Android Studio에서 이러한 디렉토리 및 파일을 추가하는 데 도움 이되는 추가 답변 을 참조하십시오 .
그런 다음 활동의 onCreate 메소드에서 다음을 수행 할 수 있습니다.
if(getResources().getBoolean(R.bool.portrait_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
최소 너비 방향으로 600dp 이상인 기기 또는 Android 3.2 이전 버전 기기 (기본적으로 태블릿)에서 x-large 는 센서 및 사용자 잠금 회전 등에 따라 정상적으로 작동합니다 . 다른 모든 것 (전화, 거의)은 초상화 일뿐입니다.
답변
이 방법으로 먼저 장치의 화면 크기를 얻을 수 있습니다.
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}
그런 다음에 따라 방향을 설정하십시오
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
답변
허용 된 답변에 대한 보충
Android Studio에서 다음 단계를 수행 하여 파일에 res/values-sw600dp
및 res/values-large
디렉토리 를 추가 할 수 bools.xml
있습니다.
값 -sw600dp
우선 프로젝트 탭의 탐색기에서 프로젝트 (Android 대신) 필터를 선택하십시오.
그런 다음 app/src/main/res
디렉토리를 마우스 오른쪽 단추로 클릭하십시오 . 새로 작성 > Android 자원 디렉토리를 선택하십시오 .
선택 작은 화면 폭을 한 후 누르 >> 버튼을 누릅니다.
입력 600
작은 화면 폭. 디렉토리 이름이 자동으로 생성됩니다. 네라고하세요.
그런 다음 새로 만든 values-sw600dp
파일을 마우스 오른쪽 버튼으로 클릭하십시오 . 새로 작성 > 값 자원 파일을 선택 하십시오 . bools
이름을 입력 하십시오.
값이 큰
values-large
디렉토리를 추가하는 것은 Android 3.2 이전 버전 (API 레벨 13)을 지원하는 경우에만 필요합니다. 그렇지 않으면이 단계를 건너 뛸 수 있습니다. values-large
디렉토리에 해당합니다 values-sw600dp
. (에 values-xlarge
해당합니다 values-sw720dp
.)
values-large
디렉토리 를 만들려면 위와 동일한 단계를 따르지만이 경우 가장 작은 화면 너비 대신 크기를 선택하십시오 . 선택 대형 . 디렉토리 이름이 자동으로 생성됩니다.
이전과 같이 디렉토리를 마우스 오른쪽 단추로 클릭하여 bools.xml
파일 을 작성 하십시오.
답변
내가 한 방법은 다음과 같습니다 ( http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html에서 영감을 얻음 ).
AndroidManifest.xml에서 세로와 가로 사이에서 변경하려는 각 활동에 대해 (screenSize를 추가했는지 확인하십시오-필요하지 않았습니다!) 여기에서 화면 방향을 설정할 필요는 없습니다. :
android:configChanges="keyboardHidden|orientation|screenSize"
각 활동에 추가하는 방법 :
public static boolean isXLargeScreen(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
및 : (이 방법을 재정의하지 않으면 방향을 변경할 때 앱이 onCreate ()를 호출합니다)
@Override
public void onConfigurationChanged (Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (!isXLargeScreen(getApplicationContext()) ) {
return; //keep in portrait mode if a phone
}
//I set background images for landscape and portrait here
}
각 활동의 onCreate ()에서 :
if (!isXLargeScreen(getApplicationContext())) { //set phones to portrait;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
//I set background images here depending on portrait or landscape orientation
}
내가 알아낼 수없는 유일한 것은 가로에서 세로로 또는 그 반대로 전환 할 때 앱이 레이아웃 파일을 변경하도록하는 방법입니다. 나는 대답이 위의 링크와 비슷한 것을하고 있다고 가정하지만, 나에게 도움이되지는 못했습니다. 모든 데이터가 삭제되었습니다. 그러나 세로 및 가로에 동일한 레이아웃 파일이있는 간단한 응용 프로그램이 있으면 작동합니다.
답변
다음 지니의 대답 , 나는 그것이 같은 다음됩니다 할 수있는 가장 신뢰할 수있는 방법을 생각한다 :
여기 에 설명 된대로 부울 sw600dp에 리소스를 넣습니다. 접두사 sw 가 있어야합니다. 그렇지 않으면 제대로 작동하지 않습니다.
res / values-sw600dp / dimens.xml에서
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">true</bool>
</resources>
res / values / dimens.xml에서
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">false</bool>
</resources>
그런 다음 부울을 검색하는 메소드를 작성하십시오.
public class ViewUtils {
public static boolean isTablet(Context context){
return context.getResources().getBoolean(R.bool.isTablet);
}
}
그리고이 활동을 원하는 활동에서 확장되는 기본 활동 :
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!ViewUtils.isTablet(this)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
}
따라서 각 활동은 BaseActivity를 확장합니다.
public class LoginActivity extends BaseActivity //....
중요 :에서 확장하더라도 AndroidManifest.xml에서 각 BaseActivity
행 android:configChanges="orientation|screenSize"
을 추가해야합니다 Activity
.
<activity
android:name=".login.LoginActivity"
android:configChanges="orientation|screenSize">
</activity>
답변
글쎄, 이것은 약간 늦었지만 여기에 XML 전용 이지만 setRequestedOrientation
방향을 변경 해야하는 것처럼 활동을 다시 만들지 않는 해킹 솔루션이 있습니다.
답변
허용 된 답변에 따라 , 나는 누군가를 도울 희망 솔루션과 함께 kotlin 파일을 추가하고 있습니다
이 bool 리소스 res/values
를 bools.xml 또는 그 밖의 다른 것으로 넣습니다 (파일 이름은 중요하지 않음).
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">true</bool>
</resources>
이것에 res/values-sw600dp
넣고 res/values-sw600dp-land
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="portrait_only">false</bool>
</resources>
그런 다음 활동 또는 단편화에서 아래 행에 추가하십시오.
class MyActivity : Activity() {
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
if (resources.getBoolean(R.bool.portrait_only)) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
super.onCreate(savedInstanceState)
}
@SuppressLint("SourceLockedOrientationActivity")
override fun onConfigurationChanged(newConfig: Configuration) {
if (resources.getBoolean(R.bool.portrait_only)) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
super.onConfigurationChanged(newConfig)
}
}