在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个问题:
从您的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;
}
}
然后,在你的Task
, Dialog
, View
,你可以使用这种类型的代码来获得你的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