2016-08-09 42 views
-1

我正在開發一個應用程序,使用條形碼閱讀器,我從條形碼閱讀器的代碼,我遵循教程。我試圖把它放在導航抽屜裏,這是我的麻煩開始的地方。問題與不兼容的類型 - 片段/活動(Java)

public class MainScreen extends Fragment implements View.OnClickListener 
{ 
    //Assign what the user sees to this variable, which XML for example 
    View MyView; 
    TextView Result,Result2; 
    Button Scan; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     MyView = inflater.inflate(R.layout.home_screen,container,false); 
     Scan=(Button)MyView.findViewById(R.id.btnScan); 
     Result=(TextView)MyView.findViewById(R.id.txtResult); 
     Result2=(TextView)MyView.findViewById(R.id.txtResult2); 

     Scan.setOnClickListener(this); 
     return MyView; 
    } 

    @Override 
    public void onClick(View v) 
    { 
     if (v.getId()==R.id.btnScan) 
     { 
      //Error is here 
      IntentIntegrator ScanIntegrator = new IntentIntegrator(this); 
      ScanIntegrator.initiateScan(); 
     } 
    } 

正如評論顯示,誤差是IntentIntegrator class的實例化過程中,更具體由「this'-紅線彈出一條消息說,它不能被應用到我的com。示例文件夾中。

運行這樣的代碼給我的錯誤"Error:(60, 68) error: incompatible types: MainScreen cannot be converted to Activity" - 如果我改變MainScreen類的FragmentActivity我得到了同樣的錯誤,只是說,它不能被改變爲一個片段。

這裏是IntentIntegrator類,如果任何人需要看到它。

public class IntentIntegrator { 
    public static final int REQUEST_CODE = 0x0000c0de; // Only use bottom 16 bits 
    private static final String TAG = IntentIntegrator.class.getSimpleName(); 
    public static final String DEFAULT_TITLE = "Install Barcode Scanner?"; 
    public static final String DEFAULT_MESSAGE = 
      "This application requires Barcode Scanner. Would you like to install it?"; 
    public static final String DEFAULT_YES = "Yes"; 
    public static final String DEFAULT_NO = "No"; 
    private static final String BS_PACKAGE = "com.google.zxing.client.android"; 
    private static final String BSPLUS_PACKAGE = "com.srowen.bs.android"; 
    // supported barcode formats 
    public static final Collection<String> PRODUCT_CODE_TYPES = list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "RSS_14"); 
    public static final Collection<String> ONE_D_CODE_TYPES = 
      list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "CODE_39", "CODE_93", "CODE_128", 
        "ITF", "RSS_14", "RSS_EXPANDED"); 
    public static final Collection<String> QR_CODE_TYPES = Collections.singleton("QR_CODE"); 
    public static final Collection<String> DATA_MATRIX_TYPES = Collections.singleton("DATA_MATRIX"); 
    public static final Collection<String> ALL_CODE_TYPES = null; 
    public static final List<String> TARGET_BARCODE_SCANNER_ONLY = Collections.singletonList(BS_PACKAGE); 
    public static final List<String> TARGET_ALL_KNOWN = list(
      BS_PACKAGE, // Barcode Scanner 
      BSPLUS_PACKAGE, // Barcode Scanner+ 
      BSPLUS_PACKAGE + ".simple" // Barcode Scanner+ Simple 
// What else supports this intent? 
    ); 
    private final Activity activity; 
    private String title; 
    private String message; 
    private String buttonYes; 
    private String buttonNo; 
    private List<String> targetApplications; 
    private final Map<String,Object> moreExtras; 
    public IntentIntegrator(Activity activity) { 
     this.activity = activity; 
     title = DEFAULT_TITLE; 
     message = DEFAULT_MESSAGE; 
     buttonYes = DEFAULT_YES; 
     buttonNo = DEFAULT_NO; 
     targetApplications = TARGET_ALL_KNOWN; 
     moreExtras = new HashMap<String,Object>(3); 
    } 



    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public void setTitleByID(int titleID) { 
     title = activity.getString(titleID); 
    } 
    public String getMessage() { 
     return message; 
    } 
    public void setMessage(String message) { 
     this.message = message; 
    } 
    public void setMessageByID(int messageID) { 
     message = activity.getString(messageID); 
    } 
    public String getButtonYes() { 
     return buttonYes; 
    } 
    public void setButtonYes(String buttonYes) { 
     this.buttonYes = buttonYes; 
    } 
    public void setButtonYesByID(int buttonYesID) { 
     buttonYes = activity.getString(buttonYesID); 
    } 
    public String getButtonNo() { 
     return buttonNo; 
    } 
    public void setButtonNo(String buttonNo) { 
     this.buttonNo = buttonNo; 
    } 
    public void setButtonNoByID(int buttonNoID) { 
     buttonNo = activity.getString(buttonNoID); 
    } 
    public Collection<String> getTargetApplications() { 
     return targetApplications; 
    } 
    public final void setTargetApplications(List<String> targetApplications) { 
     if (targetApplications.isEmpty()) { 
      throw new IllegalArgumentException("No target applications"); 
     } 
     this.targetApplications = targetApplications; 
    } 
    public void setSingleTargetApplication(String targetApplication) { 
     this.targetApplications = Collections.singletonList(targetApplication); 
    } 
    public Map<String,?> getMoreExtras() { 
     return moreExtras; 
    } 
    public final void addExtra(String key, Object value) { 
     moreExtras.put(key, value); 
    } 
    public final AlertDialog initiateScan() { 
     return initiateScan(ALL_CODE_TYPES); 
    } 
    public final AlertDialog initiateScan(Collection<String> desiredBarcodeFormats) { 
     Intent intentScan = new Intent(BS_PACKAGE + ".SCAN"); 
     intentScan.addCategory(Intent.CATEGORY_DEFAULT); 
// check which types of codes to scan for 
     if (desiredBarcodeFormats != null) { 
// set the desired barcode types 
      StringBuilder joinedByComma = new StringBuilder(); 
      for (String format : desiredBarcodeFormats) { 
       if (joinedByComma.length() > 0) { 
        joinedByComma.append(','); 
       } 
       joinedByComma.append(format); 
      } 
      intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString()); 
     } 
     String targetAppPackage = findTargetAppPackage(intentScan); 
     if (targetAppPackage == null) { 
      return showDownloadDialog(); 
     } 
     intentScan.setPackage(targetAppPackage); 
     intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
     attachMoreExtras(intentScan); 
     startActivityForResult(intentScan, REQUEST_CODE); 
     return null; 
    } 
    protected void startActivityForResult(Intent intent, int code) { 
     activity.startActivityForResult(intent, code); 
    } 
    private String findTargetAppPackage(Intent intent) { 
     PackageManager pm = activity.getPackageManager(); 
     List<ResolveInfo> availableApps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
     if (availableApps != null) { 
      for (ResolveInfo availableApp : availableApps) { 
       String packageName = availableApp.activityInfo.packageName; 
       if (targetApplications.contains(packageName)) { 
        return packageName; 
       } 
      } 
     } 
     return null; 
    } 
    private AlertDialog showDownloadDialog() { 
     AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity); 
     downloadDialog.setTitle(title); 
     downloadDialog.setMessage(message); 
     downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       String packageName = targetApplications.get(0); 
       Uri uri = Uri.parse("market://details?id=" + packageName); 
       Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
       try { 
        activity.startActivity(intent); 
       } catch (ActivityNotFoundException anfe) { 
// Hmm, market is not installed 
        Log.w(TAG, "Google Play is not installed; cannot install " + packageName); 
       } 
      } 
     }); 
     downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) {} 
     }); 
     return downloadDialog.show(); 
    } 
    public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == REQUEST_CODE) { 
      if (resultCode == Activity.RESULT_OK) { 
       String contents = intent.getStringExtra("SCAN_RESULT"); 
       String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT"); 
       byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES"); 
       int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE); 
       Integer orientation = intentOrientation == Integer.MIN_VALUE ? null : intentOrientation; 
       String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL"); 
       return new IntentResult(contents, formatName, rawBytes, orientation, errorCorrectionLevel); 
      } 
      return new IntentResult(); 
     } 
     return null; 
    } 
    public final AlertDialog shareText(CharSequence text, CharSequence type) { 
     Intent intent = new Intent(); 
     intent.addCategory(Intent.CATEGORY_DEFAULT); 
     intent.setAction(BS_PACKAGE + ".ENCODE"); 
     intent.putExtra("ENCODE_TYPE", type); 
     intent.putExtra("ENCODE_DATA", text); 
     String targetAppPackage = findTargetAppPackage(intent); 
     if (targetAppPackage == null) { 
      return showDownloadDialog(); 
     } 
     intent.setPackage(targetAppPackage); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
     attachMoreExtras(intent); 
     activity.startActivity(intent); 
     return null; 
    } 
    private static List<String> list(String... values) { 
     return Collections.unmodifiableList(Arrays.asList(values)); 
    } 
    private void attachMoreExtras(Intent intent) { 
     for (Map.Entry<String,Object> entry : moreExtras.entrySet()) { 
      String key = entry.getKey(); 
      Object value = entry.getValue(); 
// Kind of hacky 
      if (value instanceof Integer) { 
       intent.putExtra(key, (Integer) value); 
      } else if (value instanceof Long) { 
       intent.putExtra(key, (Long) value); 
      } else if (value instanceof Boolean) { 
       intent.putExtra(key, (Boolean) value); 
      } else if (value instanceof Double) { 
       intent.putExtra(key, (Double) value); 
      } else if (value instanceof Float) { 
       intent.putExtra(key, (Float) value); 
      } else if (value instanceof Bundle) { 
       intent.putExtra(key, (Bundle) value); 
      } else { 
       intent.putExtra(key, value.toString()); 
      } 
     } 
    } 
} 

感謝

+0

我敢打賭,你混合使用非詢問服務片段支持 – Selvin

回答

1

在您MainScreen片段的行數60使用「getActivity()」而不是「本」

IntentIntegrator ScanIntegrator = new IntentIntegrator(getActivity()); 
+0

這樣做了,謝謝! – Demonic217

+0

歡迎您! –