2017-12-29 8 views
0

画面の向きに合わせてdimens.xmlの値を正しく読み込むことができません。 スマートフォン用には、私の活動をタブレットや肖像画に表示する必要があります。 ここにいくつかのコードがあります。画面の向きに応じて不適切な値をロードする

値\ dimens.xml

<resources> 
    <dimen name="drawer_content_padding">0dp</dimen> 
</resources> 

値-sw600dpランド\のdimens.xml

<resources> 
    <dimen name="drawer_content_padding">340dp</dimen> 
</resources> 

活性

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Configuration config = getResources().getConfiguration(); 
     if (config.smallestScreenWidthDp >= 600){ 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     } else { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     } 
     setContentView(R.layout.activity_main); 
    } 
} 

活性XML

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.orientationtest.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@dimen/drawer_content_padding" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

</android.support.constraint.ConstraintLayout> 

ホーム画面がポートレートモードの場合、タブレットでアプリケーションを実行していますが、これは私が持っているものです。 enter image description here

ホーム画面がランドスケープモードの場合は、私のAppをタブレットで実行していますが、これは私が持っているものです。 enter image description here

問題:私は私のデバイス上であなたのコードを検討してきた値の両方のケースで340.0

+0

に多分私が正しくあなたを理解していないではないが、あなたはあなたのランドスケープモードである場合に配置する必要がありますタブレット(600を超える)は、値sw600dp-land \ dimens.xmlファイルから値を取り、0にすることはできません。 –

+0

@MishaAkopov私のアクティビティは横向きモードですが、私のアプリ外のタブレットはポートレートまたは風景。両方の風景がきれいですが、私のアプリの外に似顔絵がある場合、アプリは値の次元を読み込まない-sw600dp-land folder – digulino

+0

両方の値を常に340dpにします。 –

答えて

1

あなたは両方の向きのために、そのディメンションを使用する場合は、フォルダvalues-sw600dpからdimens.xmlファイルは、values-sw600dp-land

1

を取得する必要があります。すべて正常に動作します。唯一の問題は、オリエンテーションの変更後に自分のアクティビティが再作成されないことです。私はそれができる唯一のものだと思います。

android:configChanges="keyboardHidden|screenSize|orientation" 

あなたのマニフェストでは、あなたの活動のために。チェックしてください。

アプリのマニフェストの原因の副作用でこのオプション(configChanges)を除去した場合は、風景に肖像画から、あなたのテーブルを変更した後、あなたは

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Log.e(TAG, "onConfigurationChanged: " + getResources().getDimension(R.dimen.drawer_content_padding)); 
    } 

にこの身を処理する必要があり、onConfigurationChangedと呼ばれ、そこに、このメソッド内れます正しい二次元値(340dp)になり、ビューに手動で設定することができます。

+0

あなたの答えをありがとう。はい、私の活動が自分自身を作り直して、あなたが習得したconfigChangesを削除しても動作します。残念ながら私はこれを行うことはできません。なぜなら、私の元のアプリケーションには多くの副作用があるからです。それを再作成せずにこれを行う他の方法はありますか? – digulino

+0

はい、可能です、更新された回答を参照してください –

+0

もう一度お返事ありがとうございます。それは動作しますが、あなたの解決策はちょっと複雑だと思います。なぜなら、 '-land'ファイルを追加することは私のケースでは問題ではないので、@DmitryArcの回答を受け入れることになります。 – digulino

関連する問題