studio - Encabezado común en diferentes actividades usando BaseActivity en Android
change main activity name android (4)
Quiero escribir código una vez y usarlo en diferentes actividades. He creado una Base Activity class
para eso. También el encabezado de todos los diseños en diferentes actividades son los mismos. Lo he hecho con la ayuda de la etiqueta <include layout >
.
Ahora el problema es que mi código BaseActivity
no se está ejecutando. Estoy intentando esta primera vez que no tengo mucha idea al respecto.
1.) El código de BaseActivity está abajo:
package com.waheguru.app;
import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public abstract class BaseActivityMenu extends Activity {
//action id
private static final int ID_UP = 1;
private static final int ID_DOWN = 2;
private static final int ID_SEARCH = 3;
private static final int ID_INFO = 4;
private static final int ID_ERASE = 5;
private static final int ID_OK = 6;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.header);
ActionItem nextItem = new ActionItem(ID_DOWN, "Book", getResources().getDrawable(R.drawable.menu_down_arrow));
ActionItem prevItem = new ActionItem(ID_UP, "Bookmark", getResources().getDrawable(R.drawable.menu_up_arrow));
ActionItem searchItem = new ActionItem(ID_SEARCH, "Find", getResources().getDrawable(R.drawable.menu_search));
ActionItem infoItem = new ActionItem(ID_INFO, "Info", getResources().getDrawable(R.drawable.menu_info));
ActionItem eraseItem = new ActionItem(ID_ERASE, "Clear", getResources().getDrawable(R.drawable.menu_eraser));
ActionItem okItem = new ActionItem(ID_OK, "OK", getResources().getDrawable(R.drawable.menu_ok));
//use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked
prevItem.setSticky(true);
nextItem.setSticky(true);
//create QuickAction. Use QuickAction.VERTICAL or QuickAction.HORIZONTAL param to define layout
//orientation
final QuickAction quickAction = new QuickAction(this, QuickAction.VERTICAL);
//add action items into QuickAction
quickAction.addActionItem(nextItem);
quickAction.addActionItem(prevItem);
quickAction.addActionItem(searchItem);
quickAction.addActionItem(infoItem);
quickAction.addActionItem(eraseItem);
quickAction.addActionItem(okItem);
//Set listener for action item clicked
quickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {
public void onItemClick(QuickAction source, int pos, int actionId) {
ActionItem actionItem = quickAction.getActionItem(pos);
//here we can filter which action item was clicked with pos or actionId parameter
if (actionId == ID_SEARCH) {
Toast.makeText(getApplicationContext(), "Let''s do some search action", Toast.LENGTH_SHORT).show();
} else if (actionId == ID_INFO) {
Toast.makeText(getApplicationContext(), "I have no info this time", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show();
}
}
});
//set listnener for on dismiss event, this listener will be called only if QuickAction dialog was dismissed
//by clicking the area outside the dialog.
quickAction.setOnDismissListener(new QuickAction.OnDismissListener() {
public void onDismiss() {
Toast.makeText(getApplicationContext(), "Dismissed", Toast.LENGTH_SHORT).show();
}
});
Button books=(Button)findViewById(R.id.book);
books.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent=new Intent(ExampleActivity.this,List_of_books.class);
startActivityForResult(intent, 0);
}
});
//show on btn1
Button btn1 = (Button) this.findViewById(R.id.menu);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
quickAction.show(v);
}
});
}
}
2.) La Actividad extendió la Actividad Base.
package com.waheguru.app;
import android.app.Activity;
import android.os.Bundle;
public class ABCActivity extends BaseActivityMenu {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
}
}
Entonces, ¿alguien puede ayudarme cuando estoy haciendo algo mal?
Creo que deberías lograrlo usando Fragment
, esto puede ayudarte.
1 - en main.xml
, agregue:
<fragment
android:id="@+id/header"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
class="com.package.name.HeaderPanel" />
//remaining is same
2 - la BaseActivity
que extiende FragmentActivity
:
public class BaseActivityMenu extends FragmentActivity {
private static final String TAG = Default.class.getName() + " - ";
private int mResLayoutId;
public void onCreate(Bundle savedInstanceState, int resLayout){
super.onCreate(savedInstanceState);
setContentView(resLayout);
mResLayoutId = resLayout;
switch(mResLayoutId){
// here change with your xml file
case R.layout.home:
// set here common control like header textview
break;
default:
break;
}
}
}
3 - Ahora, puedes ampliar tu Activity
con la BaseActivity
. Esto permitirá que la Activity
sea extendida por FragmentActivity
:
public class ABCActivity extends BaseActivityMenu {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.home);
}
}
En el código, su actividad base se llama ExampleActivity
, pero en su clase secundaria está extendiendo BaseActivityMenu
. No sé de dónde viene.
Tal vez cambio:
public class ABCActivity extends BaseActivityMenu
A esto:
public class ABCActivity extends ExampleActivity
Además, le sugiero que defina su actividad base ( ExampleActivity
) como una clase abstracta . Por ejemplo:
public abstract class ExampleActivity extends Activity
Si lo hace, no definirá su clase base como concreta y facilitará la depuración en caso de problemas.
Para ello, debe crear un header.xml que se incluirá en cada diseño para sus actividades de la siguiente manera:
header.xml
<RelativeLayout>
<TextView android:id="@+id/txtHeading"
.... />
</RelativeLayout>
activity_main.xml
<RelativeLayout>
<!-- include your header here -->
<include layout="@layout/header"
... />
<!-- Rest of your views -->
</RelativeLayout>
BaseActividad
abstract class BaseActivity extends Activity {
protected TextView txtHeading;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void setHeading(int resId) {
if(txtHeading == null)
txtHeading = findViewById(R.id.txtHeading);
if(txtHeading != null)
txtHeading.setText(resId);
}
}
Actividad principal
class MainActivity extends BaseActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setHeading(R.string.heading_main);
}
}
Puedes poner tantas vistas como quieras y administrar cosas comunes en BaseActivity o BaseListActivity.
Si está haciendo una herencia con actividades y su actividad básica llama a setContentView y después de eso, las llamadas de actividad real setContentView la última llamada establecerá el diseño para la actividad. Entonces, si está buscando una solución en la que todas las actividades tengan el mismo componente de encabezado, existen 2 formas.
Por cada xml de diseño de actividad incluye ese componente.
-Usted hace la función para baseActivity, por ejemplo, setContent (int layout_id) -Usted llama a eso con su actividad siempre. -Baseactivity infla una vista de raíz con encabezado e infla la vista layout_id a ese diseño. -A continuación, llama al setContentView real con ese componente.