mit button click dynamisch ein relativlayout erstellen

  • mit button click dynamisch ein relativlayout erstellen

    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
  • 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 Tipps ist auch schön. :P
  • 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?
  • 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.
  • 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());
  • 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());
  • 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 :(
  • 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 Tipps ist auch schön. :P