2017-10-31 18 views
0

私は、TabViewの3つのタブのうちの1つであるフラグメント内にRelativeLayoutを持っています。これを参照してくださいスクリーンショット - 大きなピンクの広場は私のRelativeLayoutです screenshotプログラムでRelativeLayout内のビューに余白を設定すると、この奇妙な動作を説明するにはどうすればよいですか?

右下隅に小さな青い正方形が表示されます。 RelativeLayoutは300x300dpで、小さな正方形は8x8dpなので、上端と左端を292dpに設定すると、その角に終わります。 これでプログラムの位置を変更したいと思いますが、私の場合は値を2で割っていきます。したがって、292から292にマージンを変更すると、RelativeLayoutの中心になりますが、それぞれを292 * 2に設定すると、コーナーに戻ります。 ここに何が起こっているかを知っている人がいるでしょうか?

これは私のレイアウトファイルです:

<?xml version="1.0" encoding="utf-8"?> 
 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
 

 
    
 
    <android.support.constraint.ConstraintLayout 
 

 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent"> 
 

 
     <TextView 
 
      android:layout_width="wrap_content" 
 
      android:layout_height="wrap_content" 
 
      android:width="40dp" 
 
      android:height="40dp" 
 
      android:background="@color/colorAccent" 
 
      android:text="Test!" /> 
 

 
     <RelativeLayout 
 
      android:layout_width="300dp" 
 
      android:layout_height="300dp" 
 
      android:background="@color/colorAccent" 
 
      app:layout_constraintBottom_toBottomOf="parent" 
 
      app:layout_constraintLeft_toLeftOf="parent" 
 
      app:layout_constraintRight_toRightOf="parent" 
 
      app:layout_constraintTop_toTopOf="parent"> 
 

 
      <View 
 
       android:id="@+id/position_dot" 
 
       android:layout_width="8dp" 
 
       android:layout_height="8dp" 
 
       android:layout_alignParentStart="true" 
 
       android:layout_alignParentTop="true" 
 
       android:background="@color/colorPrimary" 
 
       android:layout_marginLeft="292dp" 
 
       android:layout_marginTop="292dp"/> 
 

 
     </RelativeLayout> 
 

 

 
    </android.support.constraint.ConstraintLayout> 
 

 

 
</layout>

、これは私が余裕を更新するために使用する方法である:

fun moveDotToCurrentPosition() { 
 
     var params = positionDot.layoutParams as RelativeLayout.LayoutParams 
 

 
     params.topMargin = 292 
 
     params.leftMargin = 292 
 
     
 
     positionDot.layoutParams = params 
 
    }

コードを短くして、関連するものに限定しようとしました。何か重要なものが見つからない場合は、私に連絡してください。 私はKotlinにこれを書いていますが、Javaの回答も役に立ちます。 ありがとうございます。

答えて

1

単なる生intまたはfloat使用されているほとんどすべてのJavaコードのディメンション値PX単位、ない DP。 hdpiデバイスでコードを実行している可能性が非常に高いです。もしそうなら、あなたのスクリーンの密度は1dp == 2pxを意味し、これはすべてが「2で割った」ように見える理由を説明します。

あなたは、このようなコードを使用して現在の画面密度を見つけることができます。

float density = [context].getResources().getDisplayMetrics().density; 

そして、あなたはその後px値を取得するには、このdensityことにより、任意のdp値を掛けることができます。あなたが<dimen>リソースとして保存した寸法で作業している場合

あるいは、あなただけ呼び出すことができます。

int dimen = [context].getResources().getDimensionPixelSize(R.dimen.my_dimen); 
+0

それはトリックです - ありがとう!しかしもう1つの質問:これは、プログラムで値を変更すると、常にピクセル単位で値が転送されるため、変換する必要がある場合や、dpを使用することが可能なので、デバイスに翻訳? – michpohl

+0

(XMLとは対照的に)コード内の次元値を使って作業しているときは、現在の 'DisplayMetrics'に基づいて' px'から 'dp'への変換を行うか、 'getDimensionPixelSize()'を使用します。 1つのしわは、 'TextView'の' setTextSize(int、float) 'メソッドのような)いくつかの場所があり、使用する"単位 "を指定できます。この場合、' TypedValue.COMPLEX_UNIT_DIP'を渡して'dp'値を使います。 –

+0

私は参照してください。ありがとうございました! – michpohl

0

を、あなたの利益を更新するために使用されている値は、ピクセルサイズ

であります
params.topMargin = 292 
params.leftMargin = 292 

あなたが292dpするためにそれらを変更したい場合は、DIMENリソースをロードしたり、displayMetric密度の値を掛けてください

あなたはアンコのディップを使用することができます機能

fun Context.dip(value: Int): Int = (value * resources.displayMetrics.density).toInt() 

は、あなたのコードは次のようになります。

params.topMargin = dip(292) 
params.leftMargin = dip(292) 

多分これはあなたの問題を解決することができます。

関連する問題