无法将contextImp强制转换为Activity错误?

时间:2015-06-02 15:17:08

标签: android android-activity android-actionbar

在我的应用中,我有一个自定义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)

很快,我处理了上下文,但我无法从上下文中获取活动。我该如何解决这个问题?

2 个答案:

答案 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);