在视图中实现方法 startActivityForResult

Posted

技术标签:

【中文标题】在视图中实现方法 startActivityForResult【英文标题】:implement a method startActivityForResult in a view 【发布时间】:2016-01-11 13:33:01 【问题描述】:

我有一个 ListView,每个项目都有两张图片,希望你点击其中一张我用 zxing 读取 QR 码。

我在调用 startActivityForResult 方法时遇到错误,并且不知道哪个方法可以替换它或如何替换它。 我留下一些代码: 我的持有人班

public class ObrasHolder 
    public ImageView foto;
    public TextView num, iden, ubi,hombres,material,equipo;
    public RelativeLayout fondo;
    public TextView eq1, eq2, eq3, eq4;
    public TextView g1,g2,g3,g4;
    public ImageView cam,qr;

我的自定义适配器:

public class ObrasAdapter extends ArrayAdapter<Obra> 
    public Context context;
    private ArrayList<Obra> datos;

    public void DisplayProjectListAdapter(Context c) 
        context = c;
    

    public ObrasAdapter(Context context, ArrayList<Obra> datos) 
        super(context, R.layout.listview_item, datos);
        this.context = context;
        this.datos = datos;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View item = convertView;
        ObrasHolder holder;

        if (item == null) 
            item = LayoutInflater.from(context).inflate(R.layout.listview_item,
                    null);

            holder = new ObrasHolder();
            holder.foto = (ImageView) item.findViewById(R.id.imgAnimal);
            holder.num = (TextView) item.findViewById(R.id.numC);
            holder.iden = (TextView) item.findViewById(R.id.idenC);
            holder.ubi = (TextView) item.findViewById(R.id.ubiC);
            holder.hombres = (TextView) item.findViewById(R.id.homC);
            holder.material = (TextView) item.findViewById(R.id.matC);
            holder.eq1 = (TextView) item.findViewById(R.id.eq1);
            holder.eq2 = (TextView) item.findViewById(R.id.eq2);
            holder.eq3 = (TextView) item.findViewById(R.id.eq3);
            holder.eq4 = (TextView) item.findViewById(R.id.eq4);
            holder.g1 = (TextView) item.findViewById(R.id.g1);
            holder.g2 = (TextView) item.findViewById(R.id.g2);
            holder.g3 = (TextView) item.findViewById(R.id.g3);
            holder.g4 = (TextView) item.findViewById(R.id.g4);
            holder.fondo = (RelativeLayout) item.findViewById(R.id.fondobra);
            holder.cam = (ImageView) item.findViewById(R.id.cam);
            holder.qr = (ImageView) item.findViewById(R.id.qr);

            item.setTag(holder);
        
        holder = (ObrasHolder) item.getTag();

        holder.qr.setOnClickListener(new OnClickListener()            
            @Override
            public void onClick(View v) 

                Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                startActivityForResult(intent, 0);   //Error because is undefined for the type new View.OnClickListener()     
            
         );

        return item;
    

    public void onActivityResult(int requestCode, int resultCode, Intent intent) 
       if (requestCode == 0) 
          if (resultCode == RESULT_OK) 
             String contents = intent.getStringExtra("SCAN_RESULT");
             // Handle successful scan
           else if (resultCode == RESULT_CANCELED) 
             // Handle cancel
          
       
    


有办法解决吗?

我也给出了另一个错误。在方法 onActivityResult。 谢谢!!

【问题讨论】:

【参考方案1】:

尝试将其添加到持有适配器的 Activity

public void onActivityResult(int requestCode, int resultCode, Intent intent) 
       if (requestCode == 0) 
          if (resultCode == RESULT_OK) 
             String contents = intent.getStringExtra("SCAN_RESULT");
             // Handle successful scan
           else if (resultCode == RESULT_CANCELED) 
             // Handle cancel
          
       
    

【讨论】:

您好,非常感谢。那个方法最后放到了我自定义适配器的类里,你说是放在holder类里? 是的,在适配器的上下文中。 我想我不明白你……你说这个? public ObrasAdapter(Context context, ArrayList&lt;Obra&gt; datos) super(context, R.layout.listview_item, datos); this.context = context; this.datos = datos; public void onActivityResult(int requestCode, int resultCode, Intent intent) 没有。您使用 ObrasAdapter 作为 ListView 的适配器,对吗?您应该将您的 onActivityResult 方法放在承载此 ListView 的活动中。 所有这些问题都与您最初的问题无关。我建议你创建一个新问题。【参考方案2】:

它未定义,因为系统正在寻找setOnClickListenercontext 中的方法。您应该为其提供全局上下文。 您有上下文变量,但这还不够,您应该尝试使用 Activity 类型包装上下文。

((Activity)context).startActivityForResult(intent, 0);

这对你有用,但只要确保当你将上下文传递给构造函数时,你使用 this 关键字将活动上下文传递给它。

【讨论】:

谢谢,但它说:活动无法解析为类型 它的意思,确保你已经导入了这个语句:import android.app.Activity; 现在执行时出现错误:` android.content.ActivityNotFoundException: No Activity found to handle Intent act=com.google.zxing.client.android.SCAN (has extras) at android .app.Instrumentation.checkStartActivityResult(Instrumentation.java:1659)` 我在论坛上找到了这个但不太明白它们的意思:[链接] (***.com/questions/16970356/...) 它现在与您发布的问题无关。这与您的意图有关。您正在寻找未安装在手机中或您的应用程序无法找到的活动。确保您已安装此应用程序,您正在将您的意图定向到该应用程序。您可以在这里下载最新的zxing扫描应用,github.com/zxing/zxing/releases

以上是关于在视图中实现方法 startActivityForResult的主要内容,如果未能解决你的问题,请参考以下文章

您是不是在同一个 prepareForSegue 方法中为一个视图控制器的所有 segue 实现行为?

讲解iOS开发中拖动视图的实现

为同一视图控制器中的两个表实现单个“numberOfRowsInSection”方法

实现 UIToolbar 的正确方法?

屏幕旋转的处理方法,实现视图位置的变化

在通道颤动/平台视图上找不到方法创建的实现