繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM