Wie wird RelativeLayout.LayoutParams richtig angewendet ?

D

DMD-OL

Neues Mitglied
0
hi
ich möchte die Größe meiner App an die verschiedenen Handygrößen jeweils anpassen und
habe mich dazu an
adjust image button's margin,height and width programatically
gehalten.
Ich habe aber ein Problem die Höhe und Breite an ein Textfeld zu übergeben.
Ich habe es mit
How to set RelativeLayout layout params in code not in xml
versucht, was aber nicht so richtig klappt.

Mein Code in .java:
Code:
public class haupt extends AppCompatActivity {

    private TextView arbeitstag_waehlen;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.haupt_main);

        arbeitstag_waehlen = (TextView)findViewById(R.id.arbeitstag_waehlen);
        Display display=((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width=display.getWidth();
        int height=display.getHeight();
        int buttonWidth = width/5;
        int buttonHeight = height/10;

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(buttonHeight, buttonWidth);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
        arbeitstag_waehlen.setLayoutParams(params);
    }
}

... in .xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="myapplication.example.com.myapplication.haupt">

    <TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Eine Überschrift"
        android:id="@+id/datenuebersicht"
        android:layout_below="@+id/arbeitstag_waehlen"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true" />

</RelativeLayout>

Ich bekomm es nicht hin, so daß ich in der .xml die beiden layout_widht und layout_height auskommentieren kann
bzw. wie wird es korrekt gemacht?
 
Ich bekomm es nicht hin, so daß ich in der .xml die beiden layout_widht und layout_height auskommentieren kann
bzw. wie wird es korrekt gemacht?

na ganz einfach , nicht so kompliziert sehen :)

<TextView
android:layout_width="20dp"
android:layout_height="20dp"

Dein Source überscheibt das schon.

Dann machst du das hier zu kompliziert
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(buttonHeight, buttonWidth);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
arbeitstag_waehlen.setLayoutParams(params);

Kannst das vereinfachen

arbeitstag_wählen.getLayoutParams().height = (int) whatever_height;
arbeitstag_wählen.getLayoutParams().width = (int) whatever_width;





Bei deiner Berechnung hast du die DPI nicht mit berücksichtigt.
So wirst du nicht weiterkommen und dein Ziel verfehlen.

Denn dein

int buttonWidth = width/5;
int buttonHeight = height/10;

gibt dir nur feste Pixel zurück , die bekanntlich je nach DPI immer unterschiedlich sind


Bsp :
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
yInches = metrics.heightPixels / metrics.ydpi;
xInches = metrics.widthPixels / metrics.xdpi;
DISPLAY_HEIGHT = metrics.heightPixels;
DISPLAY_WIDTH = metrics.widthPixels;
DISPLAY_INCH = (float) Math.sqrt(xInches * xInches + yInches * yInches);

Und erst dann bist du auch in der Lage, deine Pixel an die tatsächlich von dir benötigte Grösse
mit Metrics zu berechnen.


Bsp :
public int mm2pixel (double mm)
{
return (int) ((double) ((double)metrics.xdpi * (mm * (1.0F / 25.4F)));
}

Wobei zu berücksichtigen ist , dass bei manchen Displays die DPI für x und y unterschiedlich sind !!!!!!!

Jetzt kommste aber selbst durch , genug der Geheimnisse :)
 
Zuletzt bearbeitet:
oh ha, ja mal schauen.
auf jeden fall danke :)
 
ich habe da doch noch ma eine frage zu:
Code:
public int mm2pixel (double mm)
{
return (int) ((double) ((double)metrics.xdpi * (mm * (1.0F / 25.4F)));
}
mm ist die von mir vorgegebene größe eines textfeldes, etc.?
 
Nein , das ist lediglich ein Beispiel zur Umrechnung von Millimeter zu Pixel auf dem Device
Was du letztendlich berechnen magst oder wie , musst du entscheiden .

Ich habe dir nur den Weg aufgezeigt
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
10
Aufrufe
211
swa00
swa00
S
Antworten
7
Aufrufe
1.152
swa00
swa00
M
Antworten
3
Aufrufe
149
moin
M
Zurück
Oben Unten