在android中从上下文获取活动

这一个让我难住。

我需要从自定义布局类中调用一个活动方法。 问题在于我不知道如何从布局中访问活动。

ProfileView

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

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?
  • 我如何从上下文中获取包含活动?

  • 从您的Activity ,只需将this作为您的布局的Context传递即可:

    ProfileView pv = new ProfileView(this, null, temp, tempPd);
    

    之后,你将在布局中有一个Context ,但你会知道它实际上是你的Activity ,你可以将它施放,以便你拥有你所需要的:

    Activity activity = (Activity) context;
    

  • 没有
  • 你不能
  • Android中有两种不同的上下文。 一个用于你的应用程序(我们称它为BIG之一),另一个用于每个视图(我们称它为活动上下文)。

    linearLayout是一个视图,所以你必须调用活动上下文。 要从活动中调用它,只需调用“this”即可。 这么容易不是吗?

    当你使用

    this.getApplicationContext();
    

    您可以调用BIG上下文,描述您的应用程序并且无法管理您的视图。

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

    问候。


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

    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

    if (DummyActivity.instance != null)
    {
        // Do your operations with DummyActivity.instance
    }
    

    这是我成功用来在分段或自定义视图中在UI中操作时将Context转换为Activity 。 它将递归解压缩ContextWrapper,如果失败则返回null。

    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;
    }
    
    链接地址: http://www.djcxy.com/p/68009.html

    上一篇: Getting activity from context in android

    下一篇: Android inflate view using an existing view object