1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Problem mit Layout erweitern

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GENiALi, 21.06.2012.

  1. GENiALi, 21.06.2012 #1
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    Hallo

    Ich will irgend wie folgendes erreichen.

    Ich habe:
    1. Ein XML mit einem FrameLayout drin, im FrameLayout irgend was.
    2. Irgend eine Activity mit irgend was drin. FrameLayout, LinearLayout, egal was.

    Ich will:
    Das XML aus Punkt 1 der Activity hinzufügen. Und zwar zuoberst. Ohne das ich wissen muss was es in der Activity gibt. Ich will nicht irgend welche ID's aus der Aktivity haben müssen um ein XML Fragment hinzuzufügen.

    Mit dem LayoutInflator brauche ich einfach zu viele Infos um das zu erreichen.

    Irgend was in der Form: currentActivity.addXmlFragmentTop(R.layout.xml_aus_punkt_1);
    currentActivity.addXmlFragmentBottom(R.layout.xml_aus_punkt_1);

    Wie krieg ich das hin?
     
  2. Tom299, 22.06.2012 #2
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Mehrfach verwendete Layout-Teile bekommen bei mir immer eine eigene XML-Datei, die kann ich dann inflaten und mit .addView(...) immer an die passende Stelle einsetzen. Vielleicht hilft dir das weiter?
     
    GENiALi bedankt sich.
  3. GENiALi, 22.06.2012 #3
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    Was ist dann genau der Unterschied zwischen .addView und dem LayoutInflator?
    b.z.w wie plaziere ich ein FrameLayout zuoberst im XML Stack?
     
  4. Tom299, 22.06.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Wieso Unterschied?

    Dein XML wird "automatisch inflated", wenn du die ContentView setzt (z.B. setContentView(R.layout.main)). Alle XML-Elemente, die in der main.xml sind, stehen dann zur Verfügung.

    Du kannst aber die ContentView nur 1 mal setzen. Brauchst du noch andere XML-Layouts (z.B. nen Header, den jede Activity haben soll), dann kannst du diese Layouts über den LayoutInflater dazuladen, um auch Zugriff auf diese Elemente zu bekommen.

    Diese Layouts kannst du dann mit .addView hinzufügen. Bei .addView() gibts die Option, als 2. Parameter die Position anzugeben, wo das Layout untergebracht werden soll.

    z.B.:
    Code:
    layout.addView(LayoutHelper.getApplicationTitleLayout(this, "Protokoll"), 0);
    
    Damit füge ich mein ApplicationTitle an oberster Stelle ein, man könnte auch sonst wo einfügen. Das mußt du aber dann bei dir schauen, welche Position zu benötigst.
     
    GENiALi bedankt sich.
  5. GENiALi, 22.06.2012 #5
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    Mein naiver Ansatz war jetzt eine Methode(View view) und dann view.addView was es aber nicht gibt. Ich muss also wieder an ein Layout kommen und das bekomme ich nur vom LayoutInflator, wenn ich das richtig verstanden habe. Aber in der Methode will ich nichts von der view wissen. Einfach nur hinzufügen.

    Wie komme ich an das Rootlayout einer Activity ohne irgend eine ID?
     
  6. Tom299, 22.06.2012 #6
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Layouts, die du im Code ansprechen willst, brauchen eine ID, zumindest kenn ich das so. Ist aber auch kein Problem, deinem Root-Layout eine ID im XML zu geben, oder?

    setContentView(R.layout.ablesung2);
    LinearLayout layout = (LinearLayout) findViewById(R.id.ablesung2_linear_layout);
    layout.addView(myOtherLayout, 0);
     
  7. GENiALi, 22.06.2012 #7
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    Es gibt eine ID für das Rootlayout einer jeder Activity.

    public void displayAds(View view)
    {
    if (view != null)
    {
    _ViewGroup = (ViewGroup) view.findViewById(android.R.id.content); //ID für Rootlayout

    Allerdings kann ich dann mit addView(layoutInflator nichts mehr hinzufügen. :-(

    Meldung:
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    Mal schauen.
     
  8. Tom299, 22.06.2012 #8
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    android.R.xxx ist aber Android-Internes Layout, das ist dir klar, oder?
     
  9. GENiALi, 22.06.2012 #9
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    So, Lösung gefunden ohne dass ich die Activity genauer kennen muss.

    Code:
    public void displayAds(View view)
    {
        if (view != null)
        {
            _viewGroup = (ViewGroup) view.findViewById(android.R.id.content);
            
            LayoutInflater layoutInflater = (LayoutInflater) _activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            _adView = layoutInflater.inflate(R.layout.ads, _viewGroup, false);
            
            _adFrame = (FrameLayout) _adView.findViewById(R.id.adFrameLayout);
            
            _viewGroup.addView(_adFrame, 0);
    
    Allerdings erscheint der Content noch immer unter dem anderen Content. Die Reihenfolge stimmt also noch nicht. Die View schiesst mir Werbung ein mit einem Schliessenbutton. Der ist aber hinter den Controls. Also die 0 beim addView brachte nicht die gewünschte Wirkung. Bin aber der Lösung schon sehr viel näher als auch schon. :tongue:

    Der ursprüngliche Beitrag von 08:39 Uhr wurde um 08:40 Uhr ergänzt:

    Jap. Aber das gibt mir genau das zurück was ich suche. Jedenfals scheint das so.
     
  10. Tom299, 22.06.2012 #10
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ja, kann sein, daß du das genau brauchst. Aber manchmal übersieht man sowas und es wird nicht das eigene Layout benutzt und dann wundert man sich ;-)
     
    GENiALi bedankt sich.

Diese Seite empfehlen