【问题标题】:could not cast contextImp to Activity error?无法将 contextImp 转换为 Activity 错误?
【发布时间】:2015-06-02 15:17:08
【问题描述】:

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

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

【问题讨论】:

  • getContext() 并不总是一个 Activity 实例,所以这在大多数情况下都有效,但并非在所有情况下都有效。

标签: android android-activity android-actionbar


【解决方案1】:

尝试投射它:

((YourActivity)getActivity()).getActionBar().setDisplayShowCustomEnabled(true);

编辑:

最后,从ActionBarActivity 扩展Activity 而不是Activity 解决了这个问题。

【讨论】:

  • 我已经尝试过你的解决方案,但是android活动没有一个名为“getActivity()”的方法。有没有其他方法可以访问当前活动的操作栏?
  • 尝试设置getSupportActionBar()而不是getActionBar()方法。
  • getSupportActionBar() 方法也不包括在内。我可以在问题中分享我的所有代码吗?
  • Activity是你自定义Activity的名字吗?
  • 不,不是。它是安卓活动。我的活动扩展了 OSActivity @jlopez
【解决方案2】:

这里的问题是因为使用了getBaseContext()

一方面我们有一个Context 类型的ContextImpl 实现,但另一方面我们也有Context,它是用ContextWrapper 实现的。 ContextWrapper 是一种适配器模式,其基础 - ContextImpl 作为字段。

Activity 的本质是 ContextWrapper 或更具体的 ContextThemeWrapper,它为您的上下文行为添加了主题。

您所做的是获取了活动的基础上下文(ContextWrapper 的基础)并期望您能够再次将其转换为活动。 在许多情况下,没有理由使用 baseContext 或 applicationContext,尤其是在活动中,您需要该上下文为 Themed 才能与视图层次结构更新一起使用。

所以不是

this.context = this.getBaseContext();
this.SetCustomActionBar(this.context);

你应该使用:

this.SetCustomActionBar(this);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多