我正在尝试定义一个自定义Java类(扩展LinearLayout
),它需要在点击时启动一个活动。我的代码如下所示:
public ArizaSatiri(Context context/*, AttributeSet attrs , final Activity aktivite*/ , JSONObject mysql_satiri)
{
super(context/*, attrs*/);
// code to initialize my view :
final Context finalContext = context;
this.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
Intent newIntent = new Intent(finalContext, ArizaDetaylari.class);
finalContext.startActivity(newIntent);
}//onClick
});
}
但是当我点击实例化的视图时,我收到错误:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
从代码中可以看出,我尝试将Activity
传递给构造函数,这很有效。但这是正确的方法吗?你会推荐哪种方式?
我还需要在某个时候致电setTypeFace()
。我应该使用上下文或活动吗?
答案 0 :(得分:2)
试试这个:
this.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
Intent newIntent = new Intent(finalContext, ArizaDetaylari.class);
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finalContext.startActivity(newIntent);
}//onClick
});
答案 1 :(得分:1)
您可以将代码放入自定义视图类的onAttachedToWindow()
。
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Context context = ArizaSatiri.this.getContext();
Intent intent = new Intent(context , ArizaDetaylari.class);
context.startActivity(intent);
}
});
}
这有帮助,因为在将视图添加到活动后调用此函数,视图具有它的引用。视图的构造函数可能在添加到活动之前运行,因此错误。
如果您在xml中声明视图而不是以编程方式创建视图,这也应该有效。 (尚未测试)
答案 2 :(得分:1)
如果查看Context class reference,您会发现Activity是一个间接子类。因此,如果您使用Activity作为Context,您的代码应该可以工作。
例如:
public ArizaSatiri(Context context, JSONObject mysql_satiri){ ...}
您可以更改对ArizaSatiri构造函数的调用:
new ArizaSatiri(myActivity, mysql_satiri);
希望它有所帮助。
答案 3 :(得分:0)
如果您使用的context(finalContext)指的是ApplicationContext,那么您需要使用该标志。只需在newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
finalContext.startActivity(newIntent);
即可
这种方法存在问题,特别是当您在应用程序之外为ex:mail客户端等启动时,即使在活动完成后它仍会在最近的应用程序堆栈中继续存在,如果邮件客户端继续即使在发送邮件后仍然在那里