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

时间:2013-11-07 08:08:42

标签: 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 :

        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()。我应该使用上下文或活动吗?

4 个答案:

答案 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客户端等启动时,即使在活动完成后它仍会在最近的应用程序堆栈中继续存在,如果邮件客户端继续即使在发送邮件后仍然在那里