2012-10-21 4 views
9

Ich habe eine Anwendung, die dieselben Elemente [5 Schaltflächen als Registerkarten] in jedem Bildschirm benötigt. Ist es möglich, ein "Basis-XML-Layout" zu erstellen, das diese 5 Schaltflächen hat und dann alle anderen XML-Dateien aus dem Basislayout auf irgendeine Weise erweitern, so dass ich nicht mehrere Schaltflächen haben muss, die letztendlich die gleiche Funktionalität haben .So erstellen Sie ein generisches Android-XML-Layout für alle Aktivitäten

Gibt es eine bessere Lösung für dieses Problem, die von API unterstützt werden kann 9

Antwort

13

Erstellen Sie ein gemeinsames Layout für Ihre Basisaktivität. und dann fügen Sie dieses Layout in das gesamte Layout ein, indem Sie das Tag <include>verwenden, das Sie gleich machen möchten.

Anschließend erstellen Sie eine abstrakte Aktivität und behandeln dann alle Klicks auf die Schaltflächen und den Code in dieser Aktivität und erweitern diese Aktivität dann in allen anderen Aktivitäten, in denen Sie das Basislayout enthalten haben.

Zum Beispiel

gemeinsame Tasten xml Layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/tabhost_bg" 
    android:gravity="center" 
    android:orientation="horizontal" 
    android:weightSum="3"> 

    <Button 
     android:id="@+id/btnHome" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_home" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnSetting" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_settings" 
     style="@style/bottom_tab_btn"/> 

    <Button 
     android:id="@+id/btnMore" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bottom_btn_active" 
     android:layout_weight="1" 
     android:text="@string/label_more" 
     style="@style/bottom_tab_btn"/> 

</LinearLayout> 

Hier ist ein XML-Layout, in dem Sie über XML-Datei

<include 
     android:id="@+id/bottombar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     layout="@layout/bottom_bar" /> 

Hier android können sein: layout_width und Android: layout_height und layout sind obligatorische Attribute

Jetzt ist hier eine Basisaktivität, die das Klicken der allgemeinen Steuerelemente Griffe

public abstract class BottomBar extends Activity implements OnClickListener { 

    protected Button btnHome; 
    Button btnSetting, btnMore; 
    private Activity mActivity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mActivity = this; 
    } 

    protected void mappingWidgets() { 

     btnHome = (Button) findViewById(R.id.btnHome); 
     btnSetting = (Button) findViewById(R.id.btnSetting); 
     btnMore = (Button) findViewById(R.id.btnMore); 

     btnHome.setOnClickListener(this); 
     btnSetting.setOnClickListener(this); 
     btnMore.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v == null) 
      throw new NullPointerException(
        "You are refering null object. " 
          + "Please check weather you had called super class method mappingWidgets() or not"); 
     if (v == btnHome) { 

     } else if (v == btnSetting) { 

     }else if(v == btnMore) { 

     } 
    } 

    protected void handleBackgrounds(View v) { 
     if (v == btnHome) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnSetting) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_hover); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_active); 

     } else if (v == btnMore) { 
      btnHome.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnSetting.setBackgroundResource(R.drawable.bottom_btn_active); 
      btnMore.setBackgroundResource(R.drawable.bottom_btn_hover); 
     } 
    } 

} 

Jetzt ist noch ein Schritt, um diese Basis erstreckt sich in alle Ihre Aktivitäten Aktivität.

Sie können die Aktivität Base mit dem Schlüsselwort extends erweitern. Zum Beispiel

public class MyActivity extends BottomBar 

Hinweis: Vom Kind Aktivität müssen Sie die Super-Methode der Basisklasse aufrufen müssen, um das Klicken der gemeinsamen Kontrollen Ihrer Basislayout zu handhaben.

Sie können somit mehrere gemeinsame Layouts innerhalb Ihrer einzelnen Aktivität implementieren.

Hoffe, das wird Ihnen helfen. Viel Spaß !!

+0

Gibt es eine Möglichkeit, auf die ID des Basislayouts im Layout zuzugreifen, das es implementiert? – zabawaba99

+0

Ich glaube nicht, dass auf die Komponente des enthaltenen Layouts im Host-Layout zugegriffen werden muss. Wenn du wirklich auf afaik zugreifen willst, kannst du das verwenden. – Dharmendra

+0

Wirklich hilfreicher Beitrag !! :) – Nitesh

3

You may want to look in to the <include> tag. Es dauert effektiv eine XML, die Sie erstellt und kopieren und fügt diese in Ihrem anderen Layout.

Also, was Sie tun würden, ist ein einzelnes Layout mit Ihrem Knopf zu erstellen. Setzen Sie sie zwischen ein <merge>-Tag, so dass sie kein FrameLayout erstellen, um platziert zu werden. Verwenden Sie dann das <include>-Tag, um dasselbe Layout in Ihren anderen Layouts zu verwenden.

HINWEIS: immer Vorrang vor den layout_width und layout_height Attribute, wenn die <include>-Tag. Dies gilt auch, wenn Sie sie bei den gleichen Werten überschreiben. In früheren Versionen von Android gab es einen Fehler, der bestimmte Attribute ignorierte, wenn Sie diese Attribute nicht außer Kraft setzten.

1

Includes wäre der Weg zu gehen, aber ich habe das nie selbst zuverlässig funktionieren. Vielleicht mache ich etwas falsch, aber der Compiler nimmt nicht immer die IDs in den zusammengeführten Layouts auf.

Verwandte Themen