[英]Common Header in different activities using BaseActivity in android
I want write code once and use in different activities. 我想要一次编写代码并在不同的活动中使用。 I have created a
Base Activity class
for that . 我为此创建了一个
Base Activity class
。 Also the header of all the layouts in different activities are same. 此外,不同活动中所有布局的标题都是相同的。 I have done that with the help of the
<include layout >
tag. 我已经在
<include layout >
标签的帮助下完成了这项工作。
Now the Problem is my BaseActivity
code is not running. 现在的问题是我的
BaseActivity
代码没有运行。 I am trying this first time se don't have much idea about that. 我这是第一次尝试这个没有太多想法。
1.)The BaseActivity code is below : 1.)BaseActivity代码如下:
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.) The Activity extended the Base Activity 2.)活动扩展了基本活动
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);
}
}
So can any one help me where I am doing something wrong. 所以任何人都可以帮助我做错事。
For this you have to create one header.xml which will be included in each and every layout for your activities as follows 为此,您必须创建一个header.xml,它将包含在您的活动的每个布局中,如下所示
header.xml header.xml
<RelativeLayout>
<TextView android:id="@+id/txtHeading"
.... />
</RelativeLayout>
activity_main.xml activity_main.xml中
<RelativeLayout>
<!-- include your header here -->
<include layout="@layout/header"
... />
<!-- Rest of your views -->
</RelativeLayout>
BaseActivity BaseActivity
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);
}
}
MainActivity 主要活动
class MainActivity extends BaseActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setHeading(R.string.heading_main);
}
}
You can put as many views you want and manage common things in BaseActivity or BaseListActivity. 您可以在BaseActivity或BaseListActivity中放置所需数量的视图并管理常见事物。
If you are making inheritance with activities and your base activity calls setContentView and after that the real activity calls setContentView the last call will set the layout for activity. 如果要使用活动进行继承,并且基本活动调用setContentView,之后实际活动调用setContentView,则最后一次调用将设置活动的布局。 So if you are looking for a solution where all activies have the same header component the are 2 ways.
因此,如果您正在寻找一种解决方案,其中所有活动具有相同的标题组件,则有两种方式。
For each activity layout xml you include that component 对于每个活动布局xml,您都包含该组件
-You make function for baseActivity eg setContent(int layout_id) -You call that with your activity always. - 你为baseActivity创建函数,例如setContent(int layout_id) - 你总是用你的活动调用它。 -Baseactivity inflates a root view with header and inflates layout_id view to that layout.
-Baseactivity使用标头膨胀根视图,并将layout_id视图扩展到该布局。 -Then calls the actual setContentView with that component.
- 然后用该组件调用实际的setContentView。
I think you should achieve it using Fragment
, this may helps you. 我认为你应该使用
Fragment
来实现它,这可能会对你Fragment
帮助。
1 - in main.xml
, add: 1 - 在
main.xml
,添加:
<fragment
android:id="@+id/header"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
class="com.package.name.HeaderPanel" />
//remaining is same
2 - the BaseActivity
which extends FragmentActivity
: 2 - 扩展
FragmentActivity
的BaseActivity
:
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 - Now, you can extend your Activity
with the BaseActivity
. 3 - 现在,您可以使用
BaseActivity
扩展Activity
。 This will allow the Activity
to be extended by FragmentActivity
: 这将允许
FragmentActivity
扩展Activity
:
public class ABCActivity extends BaseActivityMenu {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.home);
}
}
In code, your base activity is called ExampleActivity
, but in your child class you are extending BaseActivityMenu
. 在代码中,您的基本活动称为
ExampleActivity
,但在您的子类中,您正在扩展BaseActivityMenu
。 Don't know where its coming from. 不知道它的来源。
Perhaps change: 也许改变:
public class ABCActivity extends BaseActivityMenu
To this: 对此:
public class ABCActivity extends ExampleActivity
Moreover, I would suggest you to define your base activity ( ExampleActivity
) as an Abstract class. 此外,我建议您将基本活动(
ExampleActivity
)定义为Abstract类。 For example: 例如:
public abstract class ExampleActivity extends Activity
Doing so will not define your base class as concrete and will make it easier to debug in case of problems. 这样做不会将您的基类定义为具体,并且在出现问题时可以更容易地进行调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.