在我的应用中,我有一个自定义Activity
,所有活动都从中扩展。我在那个主Activity中做了一些常见的操作。但是,我遇到了一个问题,我正在尝试在扩展ActionBarActivity
的主类中设置自定义操作栏。我收到了标题错误。这是我的代码行,我收到了这个错误:
public class OSActivity extends Activity
{
public Context context;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.context = this.getBaseContext();
this.SetCustomActionBar(this.context);
}
private void SetCustomActionBar(final Context context)
{
((Activity)context).getActionBar().setDisplayShowHomeEnabled(false);
((Activity)context).getActionBar().setDisplayShowTitleEnabled(false);
LayoutInflater inflater = LayoutInflater.from(context);
View acionBar = inflater.inflate(R.layout.actionbar, null);
ImageView imgAppLogo = (ImageView)acionBar.findViewById(R.id.imgLogo);
TextView txtTitle = (TextView)acionBar.findViewById(R.id.txtTitle);
txtTitle.setText(context.getClass().getSimpleName());
ImageButton imgMenuButton = (ImageButton)acionBar.findViewById(R.id.imgMenuButton);
imgMenuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(context, v);
popup.getMenuInflater().inflate(R.menu.actionbar_menu_titles, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.debt_query) {
StartIntentFromActionBarMenuSelection(context, Activity1.class);
return true;
} else if (item.getItemId() == R.id.previous_payments) {
StartIntentFromActionBarMenuSelection(context, Activity2.class);
return true;
} else if (item.getItemId() == R.id.profile) {
StartIntentFromActionBarMenuSelection(context, Activity3.class);
return true;
} else if (item.getItemId() == R.id.about) {
StartIntentFromActionBarMenuSelection(context, Activity4.class);
return true;
}
return true;
}
});
popup.show();
}
});
((Activity)context).getActionBar().setCustomView(acionBar);
((Activity)context).getActionBar().setDisplayShowCustomEnabled(true);
}
private void StartIntentFromActionBarMenuSelection(Context context, Class<?> activity)
{
Intent intent = new Intent(context, activity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
此外,这是我遇到的错误:
Caused by: java.lang.ClassCastException: android.app.ContextImpl cannot be cast to android.app.Activity
at com.some.some.SetCustomActionBar(OSActivity.java:35)
at com.some.some.OSActivity.onCreate(OSActivity.java:30)
很快,我处理了上下文,但我无法从上下文中获取活动。我该如何解决这个问题?
答案 0 :(得分:1)
尝试施展它:
((YourActivity)getActivity()).getActionBar().setDisplayShowCustomEnabled(true);
编辑:
最后,从ActionBarActivity
而不是Activity
扩展活动解决了问题。
答案 1 :(得分:0)
这里的问题是因为使用了getBaseContext()
。
一方面,我们有一个Context
类型的ContextImpl
实现,但另一方面,我们也有Context
,它们是由ContextWrapper
实现的。
ContextWrapper
是具有基础-ContextImpl
作为字段的适配器模式。
活动本质上是ContextWrapper
,或更具体地说,是ContextThemeWrapper
,它将主题添加到您的上下文行为中。
您所做的是,您获取了活动的基本上下文(ContextWrapper的基础)并期望,您将能够再次将其转换为活动。
在许多情况下,没有理由使用baseContext或applicationContext,尤其是在活动中,您需要将该上下文设为Themed
才能与View层次结构更新一起使用。
所以不是
this.context = this.getBaseContext();
this.SetCustomActionBar(this.context);
您应该使用:
this.SetCustomActionBar(this);