[英]How to Correctly Start Activity from custom View (Java Class)?
我正在尝试定义一个自定义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()
。 我应该使用上下文或活动吗?
试试这个:
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
});
您可以将代码放入自定义视图类的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中声明视图而不是以编程方式创建视图,这也应该有效。 (尚未测试)
如果查看Context类引用,您可以看到Activity是一个间接子类。 因此,如果您使用Activity作为Context,您的代码应该可以工作。
例如:
public ArizaSatiri(Context context, JSONObject mysql_satiri){ ...}
你可以改变对ArizaSatiri构造函数的调用:
new ArizaSatiri(myActivity, mysql_satiri);
希望能帮助到你。
如果您使用的context(finalContext)是指ApplicationContext,那么您需要使用该标志。 只需添加句子newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
在finalContext.startActivity(newIntent);
之前finalContext.startActivity(newIntent);
这种方法存在问题,特别是当你在应用程序之外为ex:mail client等创建一些东西时,即使在活动完成后它仍会在最近的应用程序堆栈中继续存在,如果邮件客户端仍然存在即使邮件已发送
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.