如何从自定义视图(Java类)正确启动活动?

如何从自定义视图(Java类)正确启动活动?,java,android,android-intent,android-activity,android-custom-view,Java,Android,Android Intent,Android Activity,Android Custom View,我试图定义一个自定义Java类(扩展LinearLayout),它需要在单击时启动一个活动。我的代码如下所示: public ArizaSatiri(Context context/*, AttributeSet attrs , final Activity aktivite*/ , JSONObject mysql_satiri) { super(context/*, attrs*/); // code to initialize my view :

我试图定义一个自定义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?
正如您从代码中看到的,我尝试将
活动
传递给构造函数,结果成功了。但这是正确的方法吗?你会选择哪条路

编辑:
我还需要在某个时候调用
setTypeFace()
。我应该使用上下文还是活动?

您可以将代码放入自定义视图类的
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声明视图,而不是以编程方式创建视图,那么这也应该起作用。(尚未测试)

尝试以下方法:

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
    });
如果看一下,您会发现活动是一个间接子类。因此,如果您使用活动作为上下文,您的代码应该可以工作

例如:

public ArizaSatiri(Context context, JSONObject mysql_satiri){ ...}
您可以更改对ArizaSatiri构造函数的调用:

new ArizaSatiri(myActivity, mysql_satiri);
希望有帮助。

如果您使用的上下文(finalContext)是指ApplicationContext,那么您需要使用该标志。只需添加句子
newIntent.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK)在<代码>finalContext.startActivity(newIntent)之前


这种方法的问题,特别是当您在应用程序之外为ex:mail client等启动某个应用程序时,它将继续存在于最近的应用程序堆栈中,即使在活动完成后,如果是mail client,它将继续存在于最近的应用程序堆栈中,即使在邮件发送后

以getContext()方法查看。你可以用它来代替你的FinalContext这看起来是对的。我试图从上下文转换到活动,但没有成功。现在试试这个。谢谢谢谢FLAG_ACTIVITY_NEW_TASK做什么?我害怕丢失共享偏好等数据。它有什么害处吗?没有,没有删除共享首选项数据。在Android文档中,你可以看到:这个答案应该被接受。Android建议在尝试从活动上下文外启动新活动时,使用此标志\u ACTIVITY\u NEW\u TASK