Dynamisch Elemente einer Klasse die von Linearlayout erbt hinzufügen

O

Oli95

Neues Mitglied
0
Hallo,
ich möchte ein neues Element machen in dem dynamisch Elemente hinzugefügt werden erstellen.
Damit ich das Element in XML angeben kann brauche ich eine Klasse die von Linearlayout erbt.
Hier mal ein Beispiel:
Code:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

public class MyView extends LinearLayout {

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setOrientation(LinearLayout.VERTICAL);

    }

    private void drawView() {
        TextView textView = new TextView(getContext());
        textView.setText("Hallo");
        addView(textView);
    }

    @Override
    public void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        drawView();
    }

}

Das Problem ist, dass am Ende nichts angezeigt wird.
Was hab ich falsch gemacht?
 
Hallo Oli,

das Texview ist zwar hinzugefügt, es fehlen jedoch sämtliche Massangaben und Plazierungen.
Das steht alles auf 0 ohne Positionierung und Orientierung
 
Sorry, habe etwas vergessen. Ich möchte mehrere TextViews hinzufügen.
Ich möchte den Text immer mittig positionieren. So klappt es auch nicht.
Code:
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

public class MyView extends LinearLayout {

    private String [] items;

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
        setOrientation(LinearLayout.HORIZONTAL);
        items = new String[]{"", ""};
        drawView();
    }

    public void setItems(String [] items) {
        this.items = items;
        drawView();
    }

    private void drawView() {
        removeAllViews();
        for (int i = 0; i < items.length; i++) {
            TextView textView = new TextView(getContext());
            textView.setText(String.valueOf(i + 1));
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            textView.setLayoutParams(params);
            textView.setGravity(Gravity.CENTER);
            addView(textView);
        }
    }

    @Override
    public void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        drawView();
    }

}
 
Setze doch mal die Masse fix

Code:
params.width = 200;
params.height = 100;

Und ich vermute, dass in OnSizeChanged die Paramter noch null sind.
"drawView" muss zeitlich später erfolgen- erst deinem Parent die Möglichkeit geben sich aufzubauen.

ich würde eh mit inflate arbeiten
 
swa00 schrieb:
ich würde eh mit inflate arbeiten
Das hab ich mir auch schon überlegt. Aber kann man damit auch Dynamisch Elemente hinzufügen?
 
Ich bekomme es irgendwie net hin.
Wo liegt mein Fehler?
Hier Das Layout eines Elements:
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Hallo"
        android:textSize="20dp"/>

</LinearLayout>

und hier meine Klasse:
Code:
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

public class MyView extends LinearLayout {

    private String [] items;

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
        setOrientation(LinearLayout.VERTICAL);
        items = new String[]{"", ""};
        drawView();
    }

    public void setItems(String [] items) {
        this.items = items;
        drawView();
    }

    private void drawView() {
        removeAllViews();
        for (int i = 0; i < items.length; i++) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.layout_my_view, null);
            TextView textView = rowView.findViewById(R.id.text);
            textView.setText(String.valueOf(i + 1));
            removeView(rowView);
            addView(rowView, getChildCount() - 1);
        }
    }

    @Override
    public void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        drawView();
    }

}
 
Geht das eventuell auch ohne XML Layout?
 
Hallo

Ich mische mich mal dazu.

Wie ist den nun der Stand der Dinge wird den überhaupt etwas von deiner Layout Klasse „MyView“ angezeigt?

Wie bindest du den überhaupt die Klasse in deiner Activity ein?
Zeige uns das mal.
 
Hi,
Nein es wird davon nichts angezeigt.
So binde ich es ein.
Code:
<de.oz.test.MyView
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="16dp"/>
 
Ich wolte nicht XML.
sondern wie du es in Java in der Activity einbaust
 
So:
Code:
MyView view = findViewById(R.id.layout);

view.setItems(new String[]{

        "Hallo",

        "Test",

        "lol"

});
 
Irgendwie verstehe ich dein gesamtes vorgehen nicht .

Wenn du es dynamisch machen willst wieso brauchst du da eine Klasse die du im XML einfügen willst?

Mache es doch so wie in dem Link von swa00. Da ist es wirklich dynamisch.

Das was du macht ist Startisch eigentlich eine neu erstellte View.

Wo oder wie nimmst du eigentlich Bezug auf das in der Activity geladene Layout?


Bekommst du überhaupt eine gültige Instanz von findviewbyid ?
Wird denn überhaupt der Konstruktor beim Layout Aufbau aufgerufen?
Teste das im Debugger oder mit einem Log.

Bin mir nicht sicher ob auch genau dieser Konstruktor beim Instanziiern aufgerufen wird.
Beiträge automatisch zusammengeführt:

Du willst eigentlich so was hier eine Custom View (Layout) erstellen.
How to Create a Custom Layout in Android by Extending ViewGroup Class - DZone Mobile
Du hast keine der geerbten Methoden überschrieben es gibt somit keinen Bezug zu den übergeordneten Layout der Activity.
 
Zuletzt bearbeitet:
Ja es wird aufgerufen.
Ich hab jetzt das in den Construktor reingemacht und es funktioniert.
Code:
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                getViewTreeObserver().removeOnGlobalLayoutListener(this);
                drawView();
            }
        });
 

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
487
jogimuc
J
L
Antworten
4
Aufrufe
1.337
lonnie9020
L
A
Antworten
10
Aufrufe
1.021
swa00
swa00
Zurück
Oben Unten