2017-03-21 4 views
6

minSdkVersion=15というAndroid搭載のモバイルアプリケーションを開発しています。私はタブレットの両方向とスマートフォンの肖像画のみをサポートしたいと思います。すべてが魅力のように機能しますが、私は私を狂ってしまう小さなバグを経験しています。 スマートフォンがランドスケープモードで、新しいアクティビティをトリガしようとすると、しばらくの間横長モードで開き、その後、縦向きに自動回転します。私はそのように私ができるようだからたManifest.xml内android:screenOrientationを指定しないことを選択Androidのアクティビティの向きが自動的に変更されます

public class Helper { 
    public static boolean isTablet(Context context){ 
     Configuration config = context.getResources().getConfiguration() 
     return config.smallestScreenWidthDp >= 600; 
    } 
} 

public class GeneralActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // If smartphone lock orientation to portrait 
     if (!Helper.isTablet(this.getApplicationContext())){ 
      this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
    } 
} 

が、私はこの機能でタブレットを検出: は、私の活動のそれぞれはGeneralActivityクラスを拡張しますタブレットのすべてのインターフェイスの向きをサポートします。 何か不足していますか?

EDIT

私はジョナサンでの回答で提案されているベストプラクティスを適用することを決めたが、私は説明されている問題はまだここにいます。ここにgithubに関する私のレポがあります:https://github.com/giacmarangoni/Android-Orientation-Test

+1

こんにちは、私は...同じ問題に直面していますし、それが唯一の発生をNougatデバイスのために。私はあなたと同じシナリオを持っていて、それにひどくついています。あなたは運がありましたか? –

答えて

0

ここでは、リソースとサイズの修飾子を使うのに良い方法です。

入れbools.xmlまたは何としてのres /値のこのブールリソース(ファイル名はここで問題ない):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="portrait_only">true</bool> 
</resources> 

入れのres /値-sw600dpおよび解像度で、この1 /値は、XLARGE :

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="portrait_only">false</bool> 
</resources> 

これらのディレクトリとファイルをAndroidスタジオに追加する方法については、この補足回答を参照してください。その後

、あなたの活動ののonCreateメソッドでは、あなたがこれを行うことができます:

if(getResources().getBoolean(R.bool.portrait_only)){ 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

最小の幅方向に600以上のDPいるデバイス、またはX大前のAndroid 3.2デバイス(タブレット上を、基本的に)センサーやユーザーの回転に基づいて、通常のように動作します。他のすべて(電話、かなり)は、ポートレートのみになります。

出典:Original answer

+0

こんにちはジョナサン、本当にありがとうと思います。提案した解決策を適用しようとしましたが、私が説明した問題はまだ存在しています。私はgit repoで私のプロジェクトをプッシュします。あなたが望むなら私の編集をチェックしてください。 –

+0

こんにちはJJack、私はいくつかの自由な時間を得るときに見てみましょう!、あなたはすぐに答えを得ることができます願っています。幸運! –

0

私は私のために働いて、このソリューションを持っています。あなたのonCreateでお使いのベース活性のその後マニフェスト宣言画面の向きを縦向きで

<activity android:name=".activities.MainActivity" 
     android:screenOrientation="portrait"> 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

デバイスは、不特定の方向を設定錠剤である場合は、super.onCreateを呼び出す前に。

未指定:ドキュメントから

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    if (!getResources().getBoolean(R.bool.portrait_only)) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 
    super.onCreate(savedInstanceState); 
} 

指定問わない:システムは最高の方向性を決めてみましょう。これは、下のアクティビティによって選択された方向、またはこのアクティビティがタスクの一番下にある場合のユーザーの優先方向です。ユーザがセンサベースのデバイスの回転を無視して設定することで、センサベースの方向を明示的にオフにした場合は無視されます。デフォルトでは、センサーを使用しない場合、センサーベースの方向が考慮され、ユーザーのデバイスの回転方法に基づいて方向が変更されます。

これは私のために働いており、これまでのところ私は欠点を見つけられませんでした。私はエミュレータでこれをテストしただけで、アプリケーションが携帯電話で他のソリューションと同じように肖像画から始めて回転しているようには見えません。とにかく、私は携帯電話がタブレットよりもうまく機能するためには、もっと使いやすいからです。

このソリューションで作業していないものが見つかった場合は、私を叩いてください!

+1

私はそれを試しましたが、私は風景モードでタブレット上のアプリケーションを実行しているときに任意のアクティビティを起動すると、まずポートレートモードで開き、次に風景に回転します:(任意の解決策/回避策??? –

0

また、Android Nデバイスでも同じ問題が発生しました。だから、タブレットの向きと携帯電話の肖像だけをサポートするために、私は次のトリックを実行しました:

  1. マニフェストの各アクティビティにポートレートを設定します。悪い見えますが、この場合には画面が自動回転しません:あなたのBaseActivityセットで android:screenOrientation="portrait"

  2. :menifestファイル内のすべての活動タグに次の行を追加し

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        if (isTablet(){ 
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
        } 
    } 
    
    protected boolean isTablet() { 
        return getResources().getBoolean(R.bool.tablet); 
    } 
    
0

を...

android:screenOrientation="portrait" 
+0

あなたは景観のタブレットで同じ問題を抱えています – Huby

4

私はAndroid N &で同じ問題を抱えており、解決策を見つけました。

私はまだのonCreateメソッドでsetRequestedOrientationを使用しますが、私はマニフェスト内のすべての活動のためにこれを追加しました:

android:screenOrientation="behind" 

これは、アクティビティは、前の活動と同じ向きで起動することを確認します。その後のsetRequestedOrientationはそれをオーバーライドしますが、前のアクティビティと同じ場合は、ユーザーとして何も変更されません。

あなたはこのような何かに置くことができますベースの活動で
1

/* Device types. */ 
static int MOBILE_DEVICE = 0; 
static int SEVEN_INCH_TABLET = 1; 
static int TEN_INCH_TABLET = 2; 

private static int deviceType = MOBILE_DEVICE; 
private boolean deviceTypeDetermined = false; 


@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    if (! deviceTypeDetermined) setDeviceType(); 

    /* Screen rotation only for tablets. */ 
    if (getDeviceType() < SEVEN_INCH_TABLET) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     lockScreenOrientation(); 

    ...... 
} 



// --------------------------------------------------------------------------------------------- 
static int getDeviceType() { 
    return deviceType; 
} 
// --------------------------------------------------------------------------------------------- 


// --------------------------------------------------------------------------------------------- 
private void setDeviceTypeDetermined() { 
    this.deviceTypeDetermined = true; 
} 
// --------------------------------------------------------------------------------------------- 


// --------------------------------------------------------------------------------------------- 
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 
private void setDeviceType() { 

    /* 
     Let's invest on what kind of screen our APP is invited... 

     We only make a difference in 10", 7" tablets and the rest... 
    */ 

    Display mDisplay = getWindowManager().getDefaultDisplay(); 
    Point mScreenResolution = new Point(); 

    mDisplay.getRealSize(mScreenResolution); 

    int mWidthPixels = mScreenResolution.x; 
    int mHeightPixels = mScreenResolution.y; 

    DisplayMetrics mMetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 

    float mWidthDpi = mMetrics.xdpi; 
    float mHeightDpi = mMetrics.ydpi; 

    float mWidthInches = mWidthPixels/mWidthDpi; 
    float mHeightInches = mHeightPixels/mHeightDpi; 



    double mDiagonalInches = Math.sqrt(
      (mWidthInches * mWidthInches) 
        + (mHeightInches * mHeightInches)); 


    if (mDiagonalInches >= 9) { 

     /* 
      A tablet with 8" x 5" is called a 10", but it is in fact 
      9.43398". Interesting that this kind of things happens in 
      the world of informatics.... ;) 
     */ 

     MyBaseAppCompatActivity.deviceType = TEN_INCH_TABLET; 
    } 

    else if (mDiagonalInches >= 7) { 
     MyBaseAppCompatActivity.deviceType = SEVEN_INCH_TABLET; 
    } 

    else 
    { 
     MyBaseAppCompatActivity.deviceType = MOBILE_DEVICE; 
    } 


    setDeviceTypeDetermined(); 
} 
// --------------------------------------------------------------------------------------------- 


// --------------------------------------------------------------------------------------------- 
void lockScreenOrientation() { 

    /* Screen rotation only for tablets. */ 
    if (deviceType < SEVEN_INCH_TABLET) return; 

    setRequestedOrientation(getResources().getConfiguration().orientation); 
} 
// --------------------------------------------------------------------------------------------- 


// --------------------------------------------------------------------------------------------- 
void unlockScreenOrientation() { 

    /* Screen rotation only for tablets. */ 
    if (deviceType < SEVEN_INCH_TABLET) return; 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
} 
// --------------------------------------------------------------------------------------------- 

とのonCreateであなたの活動中:

// --------------------------------------------------------------------------------------------- 
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 
protected void onCreate(Bundle savedInstanceState) { 
    // ----------------------------------------------------------------------------------------- 
    super.onCreate(savedInstanceState); 

    if (getDeviceType() >= SEVEN_INCH_TABLET) unlockScreenOrientation(); 

    setContentView(R.layout.main_activity); 

    ......... 

// --------------------------------------------------------------------------------------------- 
+0

この回答は、あなたが修正したものに関する説明を追加することで改善される可能性があります。 –

関連する問題