mit button click dynamisch ein relativlayout erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • mit button click dynamisch ein relativlayout erstellen

    Neu

    Hallo zusammen,

    Ich habe in der XML datei meiner APP schin mehrere relativLayouts. dazwischen ist ein Button, und wenn dieser angeklickt wird, dann soll ein zusätzliches Relativlayout mit textViews erstellt werden.
    Also die XML datei sieht wie folgt aus (XML Datei ist zu lang daher dieses Beispiel):

    <scrollView
    <RelativeLayout1
    <RelativeLayout2
    <RelativeLayout3
    <ImageButton/>
    </scrollView
    </RelativeLayout1
    </RelativeLayout2
    </RelativeLayout3

    nach dem ImgaeButton click soll dann so aussehen:


    <scrollView
    <RelativeLayout1
    <RelativeLayout2
    <RelativeLayout3
    <RelativeLayout4
    <ImageButton/>
    <ImageButton2/>
    </RelativeLayout4
    </RelativeLayout3
    </RelativeLayout2
    </RelativeLayout1
    </scrollView




    kann mir einer sagen wie ich das bewältigen kann?

    Danke
  • Neu

    Hallo ich denke in etwa so.

    Quellcode

    1. public class MainActivity extends AppCompatActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.test);
    6. }
    7. public void onKlick(View v){
    8. Button button4 = new Button(this);
    9. button4.setText("Huhu");
    10. LinearLayout layout3 = findViewById(R.id.layout3);
    11. LinearLayout.LayoutParams paramsButton = new LinearLayout.LayoutParams(
    12. LinearLayout.LayoutParams.WRAP_CONTENT,
    13. LinearLayout.LayoutParams.WRAP_CONTENT);
    14. LinearLayout.LayoutParams paramsLayout = new LinearLayout.LayoutParams(
    15. LinearLayout.LayoutParams.FILL_PARENT,
    16. LinearLayout.LayoutParams.WRAP_CONTENT);
    17. LinearLayout layout4 = new LinearLayout(this);
    18. layout4.setOrientation(LinearLayout.HORIZONTAL);
    19. layout3.addView(layout4, paramsLayout);
    20. layout4.addView(button4, paramsButton);
    21. }
    22. }
    Alles anzeigen


    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical">
    6. <ScrollView
    7. android:id="@+id/scroll1"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content">
    10. <LinearLayout
    11. android:id="@+id/layout1"
    12. android:layout_width="match_parent"
    13. android:layout_height="wrap_content"
    14. android:orientation="vertical">
    15. <TextView
    16. android:id="@+id/textView1"
    17. android:layout_width="400dp"
    18. android:layout_height="wrap_content"
    19. android:text="TextView" />
    20. <LinearLayout
    21. android:id="@+id/layout2"
    22. android:layout_width="match_parent"
    23. android:layout_height="wrap_content"
    24. android:orientation="vertical">
    25. <TextView
    26. android:id="@+id/textView2"
    27. android:layout_width="413dp"
    28. android:layout_height="wrap_content"
    29. android:text="TextView" />
    30. <LinearLayout
    31. android:id="@+id/layout3"
    32. android:layout_width="match_parent"
    33. android:layout_height="wrap_content"
    34. android:orientation="vertical">
    35. <TextView
    36. android:id="@+id/textView3"
    37. android:layout_width="match_parent"
    38. android:layout_height="wrap_content"
    39. android:text="TextView" />
    40. <Button
    41. android:id="@+id/Button4"
    42. android:layout_width="416dp"
    43. android:layout_height="wrap_content"
    44. android:onClick="onKlick"
    45. android:text="Test4" />
    46. </LinearLayout>
    47. </LinearLayout>
    48. </LinearLayout>
    49. </ScrollView>
    50. </RelativeLayout>
    Alles anzeigen
    Ein Feedback auf Tips ist auch schön. :P
  • Neu

    Hi danke erst mal, ich bin jetzt soweit, dass ich layouts ausgeben kann, hab jedoch folgendes Problem.
    Ich erstele zwei neuen RelativeLayout objecte. will das eine unterhalb dem anderen plazieren. das klappt aber nicht so ganz. Mein Code ist:

    Quellcode

    1. public void onClickAddFlight(View view){
    2. final float scale = getApplicationContext().getResources().getDisplayMetrics().density;
    3. RelativeLayout relLayoutFlights = (RelativeLayout)findViewById(R.id.relLayoutMultiCityFlights);
    4. int layoutNumber = relLayoutFlights.getChildCount();
    5. String str = "" + layoutNumber;
    6. Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
    7. if(layoutNumber == 3){
    8. int newRelLayoutHight = (int) (241*scale + 0.5f);
    9. relLayoutFlights.getLayoutParams().height = newRelLayoutHight;
    10. int lineHeightPixels = (int) (0.5*scale + 0.5f);
    11. int widthPixels = (int) (360*scale + 0.5f);
    12. int flightHeightPixels = (int) (80*scale + 0.5f);
    13. RelativeLayout relLayoutFlight2 = (RelativeLayout)findViewById(R.id.relLayoutFlight2);
    14. RelativeLayout.LayoutParams paramsLayoutLine2 = new RelativeLayout.LayoutParams(widthPixels, lineHeightPixels);
    15. paramsLayoutLine2.addRule(RelativeLayout.BELOW, relLayoutFlight2.getId());
    16. paramsLayoutLine2.addRule(RelativeLayout.CENTER_HORIZONTAL);
    17. RelativeLayout relLayoutFlightLine2 = new RelativeLayout(this);
    18. relLayoutFlightLine2.setBackgroundColor(getResources().getColor(R.color.colorBackgroundFlightBar));
    19. RelativeLayout.LayoutParams paramsLayoutFlight3 = new RelativeLayout.LayoutParams(widthPixels, flightHeightPixels);
    20. paramsLayoutFlight3.addRule(RelativeLayout.BELOW, relLayoutFlightLine2.getId());
    21. paramsLayoutFlight3.addRule(RelativeLayout.CENTER_HORIZONTAL);
    22. RelativeLayout relLayoutFlight3 = new RelativeLayout(this);
    23. relLayoutFlight3.setBackgroundColor(getResources().getColor(R.color.colorWhite));
    24. relLayoutFlights.addView(relLayoutFlightLine2, paramsLayoutLine2);
    25. relLayoutFlights.addView(relLayoutFlight3, paramsLayoutFlight3);
    26. }
    27. }
    Alles anzeigen

    Wo genau ist mein fehler?
  • Neu

    Das erste Layout "relLayoutFlightLine2" wird richtig plaziert genauso wie es sein muss.
    Aber das zweite layout "relLayoutFlight3" wird ganz oben in dem relLayoutFlights plaziert. es sieht so aus als ob in dem Moment, in dem ich das tue:
    paramsLayoutFlight3.addRule(RelativeLayout.BELOW, relLayoutFlightLine2.getId());
    gibt es kein relLayoutFlightLine2. ich hab mir die Id davon ausgegeben, die ist -1.


    Also "relLayoutFlight3" wird falsch positioniert.
  • Neu

    wie du in dem Code sehe kannst ich hol zwei layouts aus dem XMl datei:

    RelativeLayout relLayoutFlights = (RelativeLayout)findViewById(R.id.relLayoutMultiCityFlights);

    RelativeLayout relLayoutFlight2 = (RelativeLayout)findViewById(R.id.relLayoutFlight2)


    Quellcode

    1. <RelativeLayout
    2. android:id="@+id/relLayoutMultiCityFlights"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:layout_below="@+id/relLayoutMultiCityLine0">
    6. <RelativeLayout
    7. android:id="@+id/relLayoutFlight2"
    8. android:layout_width="360dp"
    9. android:layout_height="80dp"
    10. android:layout_centerHorizontal="true">

    Das problem muss hier liegen:
    paramsLayoutFlight3.addRule(RelativeLayout.BELOW, relLayoutFlightLine2.getId());
  • Neu

    wie ich vermutete "relLayoutFlightLine2" hat in dem moment keine ID.

    so wird das gelöst:
    RelativeLayout relLayoutFlightLine2 = new RelativeLayout(this);
    relLayoutFlightLine2.setId(View.generateViewId());damit hat dieses Layout eine Id und man kann das benutzen:paramsLayoutFlight3.addRule(RelativeLayout.BELOW, relLayoutFlightLine2.getId());
  • Neu

    Kein Ding.

    jetzt hab ich folgendes Problem:

    ich will eine Text size für meine TextView besimmen.

    ich mach das wie folgt:

    Quellcode

    1. int tvFlight3HeightPixels = (int)(20*scale + 0.5f);
    2. int tvFlight3TopMargin = (int)(3*scale + 0.5f);
    3. RelativeLayout.LayoutParams paramsLayoutFlight3Tv = new RelativeLayout.LayoutParams(dateWidthPixels, tvFlight3HeightPixels);
    4. paramsLayoutFlight3Tv.topMargin = tvFlight3TopMargin;
    5. TextView tvFlight3 = new TextView(this);
    6. tvFlight3.setId(View.generateViewId());
    7. tvFlight3.setGravity(Gravity.CENTER);
    8. tvFlight3.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.flights_textSize));
    9. tvFlight3.setText(getResources().getString(R.string.flight3));
    10. tvFlight3.setTextColor(getResources().getColor(R.color.colorBackgroundFlightBar));


    und dimens datei:

    Quellcode: dimens.xml

    1. <resources>
    2. <dimen name="fab_margin">16dp</dimen>
    3. <dimen name="flights_textSize">10sp</dimen>
    4. </resources>


    das Problem ist, dass die size sich nicht ändert.
    egal wasich da eingebe :(
  • Neu

    10sp hat sie ja.
    Und die Methode vFlight3.setTextSize( 20f ); verlangt einen float wert deshalb das f . Ich wollte wissen ob die Ressourcenauflösung richtig funktioniert. Wenn sich die Schriftgröße bei direkter Eingabe ändert stimmt zu mindestens der Rest denn wir nicht sehen können.
    Ein Feedback auf Tips ist auch schön. :P
  • Neu

    denke
    COMPLEX_UNIT_SP und nicht
    COMPLEX_UNIT_PX

    Ist besser.

    Ps.
    Wenn ich jetzt so darüber nachdenke bin ich mir nicht sicher ob das mit dem 10sp in der dimens Datei richtig ist teste auch mal nur 10 ohne das sp .
    Ein Feedback auf Tips ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()