2011-09-14 12 views
7

Tüm düzenlerde ortak bir Başlığa sahip bir uygulamam var. Kullanıcı ImageView'a btn_home no'lu kimliği tıkladığında, uygulamanın belirli bir etkinliğe geri dönmesini istiyorum, örneğin "Ana" durumum.Android'de Tüm Etkinlikler için Ortak Tıklanabilir Başlık

Bunu yapmanın en iyi yolu nedir?

Her etkinlik için onClick(View v) tanımlayabilirim, ancak belki bunu yapmak için daha iyi bir yol var. Her aktiviteyi yapmak bile, onClick(View v) tanımlanmış sesleri kötü olan diğer (miras yoluyla).

header.xml

<RelativeLayout ...> 
    <RelativeLayout android:id="@+id/relativeLayout1" ...> 
     <ImageView android:id="@+id/logo_cats"></ImageView> 
     <ImageView android:id="@+id/btn_home" ...></ImageView> 
    </RelativeLayout> 
</RelativeLayout> 

her düzen

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

cevap

14

Başlığınızdan özel bir bileşen oluşturabilir ve 'onClick()' öğesini tanımlayabilirsiniz. Örneğin, RelativeLayout'u genişletecek ve header.xml'inizi buraya şişirecek yeni bir sınıf Header yapın. Ardından, <include> etiketi yerine <com.example.app.Header android:id="@+id/header" ... kullanırsınız. Kod çoğaltması yok ve başlık tamamen yeniden kullanılabilir.

UPD:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView android:id="@+id/logo" .../> 
    <TextView android:id="@+id/label" .../> 
    <Button android:id="@+id/login" .../> 
</merge> 

activity_with_header.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" ...> 
    <com.example.app.Header android:id="@+id/header" .../> 
    <!-- Other views --> 
</RelativeLayout> 

Header.java:

public class Header extends RelativeLayout { 
public static final String TAG = Header.class.getSimpleName(); 

protected ImageView logo; 
private TextView label; 
private Button loginButton; 

public Header(Context context) { 
    super(context); 
} 

public Header(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public Header(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public void initHeader() { 
     inflateHeader(); 
} 

private void inflateHeader() { 
    LayoutInflater inflater = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.header, this); 
    logo = (ImageView) findViewById(R.id.logo); 
    label = (TextView) findViewById(R.id.label); 
    loginButton = (Button) findViewById(R.id.login); 
} 

ActivityWithHeader.java İşte bazı kod örnekleri

header.xml var :Bu örnekte

public class ActivityWithHeader extends Activity { 
private View mCreate; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_with_header); 

    Header header = (Header) findViewById(R.id.header); 
    header.initHeader(); 
    // and so on 
} 
} 
, Header.initHeader() Başlığının kurucu içinde hareket edebilir, fakat genellikle bu yöntem bazı yararlı dinleyici aktarmak için iyi bir yol sağlar. Umarım bu yardımcı olur.

+0

Bu kulağa hoş geliyor. Ama bunu nasıl yaparım? – rlc

+0

Bir örnek ekledim. – Ash

+0

Altbilgiyi hiç göremiyorum. aktivite dışı sınıftaki bir etkinliğin getSystemService() 'yöntemini kullanabilir miyiz? 'getContext()' ile denedim ama hiçbir şey göstermiyor. –

3

Etkinlik sınıfını uzatın ve örneğin bir MyActivity sınıfını oluşturmak. Bu MyActivity sınıfında, onClick'in kodunu ekleyebilirsiniz.

Şimdi yalnızca üstbilginizi tutan bir düzen oluşturun. Bu yerleşimi etkinlik düzenlerinize dahil edin.

Tüm aktivitelerinizi MyActivity'den genişletin - işte bu kadar.

ListActivities'de aynı davranışa ihtiyacınız varsa, bir MyListActivity oluşturun.

+0

Bunun en iyi yolu olduğunu sanmıyorum. Çok fazla kod tekrarı. – rlc

+1

Kod tekrarı? Nerede? Etkinliği bir kez uzatır, orada bir kez oluşturup tanımlayın ve MyActivity sınıfınızı genişleten tüm Etkinliklerde otomatik olarak kullanın. Her şey bir kez yazılır, sadece bir kez. Bu Java yolu ve gereksiniminiz için mükemmel uyuyor. –

+0

Etkinliklerim var, MapActivities, ListActivities ... – rlc

İlgili konular