5

我正在尝试定义一个自定义 Java 类(扩展 a 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()在某个时候打电话。我应该为此使用上下文还是 Activity ?

4

4 回答 4

4

尝试这个:

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
    });
于 2013-11-07T08:21:21.613 回答
1

如果查看Context 类参考,您会发现 Activity 是一个间接子类。因此,如果您使用 Activity 作为上下文,您的代码应该可以工作。

例如:

public ArizaSatiri(Context context, JSONObject mysql_satiri){ ...}

您可以更改对 ArizaSatiri 构造函数的调用:

new ArizaSatiri(myActivity, mysql_satiri);

希望能帮助到你。

于 2013-11-07T08:22:32.103 回答
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 中声明您的视图而不是以编程方式创建它,这也应该有效。(尚未测试)

于 2013-11-07T08:15:45.530 回答
0

如果您使用的上下文 (finalContext) 指的是 ApplicationContext,那么您需要使用该标志。newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);只需在前面 加上一句 finalContext.startActivity(newIntent);

这种方法的问题,特别是当您在应用程序之外启动某些东西时,例如:邮件客户端等,即使在活动完成后,它是否会继续存在于最近的应用程序堆栈中,如果是邮件客户端,它会继续存在即使在邮件发送之后

于 2013-11-07T08:32:43.550 回答