2011-09-14 10 views
7

Tengo una aplicación con un encabezado común en todos los diseños. Quiero que siempre que el usuario haga clic en ImageView con ID btn_home, la aplicación regrese a una actividad específica, mi "Principal", por ejemplo.Encabezado hace clic común para todas las actividades en Android

¿Cuál es la mejor manera de hacerlo?

Sé que puedo definir el onClick(View v) para cada actividad, pero tal vez haya una mejor manera de hacerlo. Incluso haciendo que cada actividad sea algo (a través del patrimonio) otra que tiene el onClick(View v) definido suena mal.

header.xml

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

cada diseño

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

Respuesta

14

Puede crear un componente personalizado en su encabezado y definir 'onClick()' en él. Por ejemplo, cree una nueva clase Header que extienda un RelativeLayout e infle su header.xml allí. Luego, en lugar de la etiqueta <include>, usaría <com.example.app.Header android:id="@+id/header" .... Sin duplicación de código y el encabezado se vuelve totalmente reutilizable.

UPD: He aquí algunos ejemplos de código

header.xml:

<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 :

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 
} 
} 

En este ejemplo, Header.initHeader() se puede mover dentro de constructor de Cabecera, pero en general este método proporciona una buena manera de pasar en algunos oyentes útiles. Espero que esto ayude

+0

Eso suena bien. ¿Pero cómo hago eso? – rlc

+0

He agregado un ejemplo. – Ash

+0

no puedo ver el pie de página en absoluto. ¿Podemos llamar al método 'getSystemService()' de una actividad en la clase de no actividad? Intenté con 'getContext()' pero no muestra nada. –

3

extender la clase de actividad y construir una clase MyActivity por ejemplo. En esta clase de MyActivity puede incluir el código para onClick.

Ahora cree un diseño que solo contenga su encabezado. Incluye ese diseño en tus diseños de actividades.

Extienda todas sus actividades de MyActivity, eso es todo.

Si necesita el mismo comportamiento en ListActivities crear una MyListActivity también.

+0

No creo que esta sea la mejor manera de hacerlo. Tanta repetición de código – rlc

+1

¿Repetición de código? ¿Dónde? Extiende la Actividad una vez, define onClick in allí una vez y la usa automáticamente en todas las Actividades que extienden su clase MyActivity. Todo está escrito una vez, solo una vez. Esta es la forma de Java y para su requerimiento encaja perfecto. –

+0

Tengo actividades, MapActivities, ListActivities ... – rlc

Cuestiones relacionadas