首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在android中从上下文获取活动

在android中从上下文获取活动
EN

Stack Overflow用户
提问于 2012-03-27 22:16:54
回答 14查看 370.2K关注 0票数 196

这把我难倒了。

我需要在自定义布局类中调用activity方法。这样做的问题是我不知道如何从布局中访问活动。

ProfileView

代码语言:javascript
复制
public class ProfileView extends LinearLayout
{
    TextView profileTitleTextView;
    ImageView profileScreenImageButton;
    boolean isEmpty;
    ProfileData data;
    String name;

    public ProfileView(Context context, AttributeSet attrs, String name, final ProfileData profileData)
    {
        super(context, attrs);
        ......
        ......
    }

    //Heres where things get complicated
    public void onClick(View v)
    {
        //Need to get the parent activity and call its method.
        ProfileActivity x = (ProfileActivity) context;
        x.activityMethod();
    }
}

ProfileActivity

代码语言:javascript
复制
public class ProfileActivityActivity extends Activity
{
    //In here I am creating multiple ProfileViews and adding them to the activity dynamically.

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.profile_activity_main);
    }

    public void addProfilesToThisView()
    {
        ProfileData tempPd = new tempPd(.....)
        Context actvitiyContext = this.getApplicationContext();
        //Profile view needs context, null, name and a profileData
        ProfileView pv = new ProfileView(actvitiyContext, null, temp, tempPd);
        profileLayout.addView(pv);
    }
}

正如您在上面看到的,我正在以编程方式实例化profileView并将activityContext与它一起传递。2个问题:

我是否将正确的上下文传递到Profileview?

  • How中?
  1. 我是否可以从上下文中获取包含活动?
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2012-03-27 22:21:41

Activity中,只需将this作为布局的Context传入即可:

代码语言:javascript
复制
ProfileView pv = new ProfileView(this, null, temp, tempPd);

之后,您将在布局中拥有一个Context,但您将知道它实际上是您的Activity,您可以对其进行强制转换,以便获得所需的内容:

代码语言:javascript
复制
Activity activity = (Activity) context;
票数 493
EN

Stack Overflow用户

发布于 2017-09-14 03:58:14

当在片断或自定义视图中的UI中操作时,我已经成功地使用它将Context转换为Activity。它将递归解压缩ContextWrapper,如果失败则返回null。

代码语言:javascript
复制
public Activity getActivity(Context context)
{
    if (context == null)
    {
        return null;
    }
    else if (context instanceof ContextWrapper)
    {
        if (context instanceof Activity)
        {
            return (Activity) context;
        }
        else
        {
            return getActivity(((ContextWrapper) context).getBaseContext());
        }
    }

    return null;
}
票数 49
EN

Stack Overflow用户

发布于 2012-03-27 22:24:01

  1. No
  2. You无法对

执行操作

在Android中有两个不同的上下文。一个用于您的应用程序(让我们称其为大的),另一个用于每个视图(我们称其为活动上下文)。

linearLayout是一个视图,因此您必须调用活动上下文。要从活动中调用它,只需调用"this“即可。很简单,不是吗?

当您使用

代码语言:javascript
复制
this.getApplicationContext();

你调用大的上下文,一个描述你的应用程序的上下文,不能管理你的视图。

Android的一个大问题是,上下文不能调用你的活动。当有人开始开发Android时,避免这种情况是一件很重要的事情。你必须找到一种更好的方法来编写你的类(或者用"Activity activity“替换"Context context”,并在需要时将其转换为"Context“)。

致以问候。

只是为了更新我的答案。获取Activity context的最简单方法是在Activity中定义一个static实例。例如

代码语言:javascript
复制
public class DummyActivity extends Activity
{
    public static DummyActivity instance = null;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Do some operations here
    }

    @Override
    public void onResume()
    {
        super.onResume();
        instance = this;
    }

    @Override
    public void onPause()
    {
        super.onPause();
        instance = null;
    }
}

然后,在您的TaskDialogView中,您可以使用这种代码来获取Activity context

代码语言:javascript
复制
if (DummyActivity.instance != null)
{
    // Do your operations with DummyActivity.instance
}
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9891360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档