无法解析 R 符号和方法

Posted

技术标签:

【中文标题】无法解析 R 符号和方法【英文标题】:Cannot resolve R symbol and method 【发布时间】:2019-02-14 11:10:00 【问题描述】:

这个项目之前是用eclipse构建的,能够顺利运行。现在我已经在 android studio 中导入了它,它给了我一些错误。我试图清理、重建、使缓存无效/重新启动并与我的项目的 Gradle 文件同步。但是,这些都不适合我。我的 MainActivity.java 中的代码“cropImageView.getEdge()”和“cropImageView.getCircleData()”也出现错误。我不确定cropper 库是否有问题。有谁知道怎么回事?

This is the error I have gotten

我的 MainActivity.java:

public class MainActivity extends AppCompatActivity 

static Uri outPutfileUri;
public String filepath = "";
public static CropImageView cropImageView;
public static final int CAMERA_IMAGE =2;
public static final int GALLERY_CHOOSER_INTENT = 3;
public static final int GALLERY_KITKAT_INTENT_CALLED= 4;
public static Bitmap activeBmp;
public static Bitmap originalBmp;
private static final int DEFAULT_ASPECT_RATIO_VALUES = 10;
private static final String ASPECT_RATIO_X = "ASPECT_RATIO_X";
private static final String ASPECT_RATIO_Y = "ASPECT_RATIO_Y";
private int mAspectRatioX = DEFAULT_ASPECT_RATIO_VALUES;
private int mAspectRatioY = DEFAULT_ASPECT_RATIO_VALUES;
ImageView croppedImageView;
File file;
ImageButton btImage,btCrop,btProceed;
CroppingInstructionDlg dialog;

CheckBox cb_savePreferencedialog;
public static final String Save_CheckboxSettingdialog = "MyCheckBoxSettingdialogforcroppingactivity";
boolean checkedCheckboxdialog=false;
Bitmap croppedImage;
boolean cropped=false;

// this is very important to use the navtive opencv's library
     static 
            if (!OpenCVLoader.initDebug()) 
                // Handle initialization error
                Log.d("ERROR", "Unable to load OpenCV");
            
            else
            
                Log.d("SUCCESS", "OpenCV loaded");
            

        


@Override

protected void onRestoreInstanceState(Bundle bundle) 
    super.onRestoreInstanceState(bundle);
    mAspectRatioX = bundle.getInt(ASPECT_RATIO_X);
    mAspectRatioY = bundle.getInt(ASPECT_RATIO_Y);


    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final SharedPreferences sp = getSharedPreferences("activities", MODE_PRIVATE);


        dialog = new CroppingInstructionDlg(MainActivity.this);

        cb_savePreferencedialog = (CheckBox)dialog.findViewById(R.id.cb_savePreferencedialog);

         SharedPreferences prefEditdialog = getSharedPreferences(Save_CheckboxSettingdialog, MODE_PRIVATE); 

            if(prefEditdialog.contains("CheckBoxValueDialog1"))

                cb_savePreferencedialog.setChecked(true);
            
            else
            
                openDialoginstruction();
            


        cropImageView = (CropImageView) findViewById(R.id.CropImageView);
        croppedImageView = (ImageView) findViewById(R.id.croppedImageView);
        cropImageView.setVisibility(View.GONE);
        croppedImageView.setVisibility(View.GONE);


        btImage=(ImageButton) findViewById(R.id.btImage);
        btImage.setOnClickListener(new OnClickListener() 

            public void onClick(View v) 
                List<String> data= new ArrayList<String>();
                data.add("Import from local device.");
                data.add("Take camera image.");
                AdapterGetImage adapter = new AdapterGetImage(MainActivity.this);

                adapter.setData(data);

                new AlertDialog.Builder(MainActivity.this).setAdapter(adapter, new DialogInterface.OnClickListener() 




                    @Override
                    public void onClick(DialogInterface dialog, int which) 
                     //TODO - Code when list item is clicked (int which - is param that gives you the index of clicked item)

                        if (which==0) 
                            getFromGallery();
                        
                        if(which==1)
                        
                            getImageFromCamera();
                        
                    

                )
               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 

                    @Override
                    public void onClick(DialogInterface dialog, int which) 
                    
                )

                .setCancelable(false)
                .show();

              
        );
        btCrop=(ImageButton) findViewById(R.id.btCrop);
        btCrop.setOnClickListener(new OnClickListener() 

            public void onClick(View v) 
                if(cropImageView.getVisibility() == View.VISIBLE)
                    croppedImage = cropImageView.getCroppedImage();
                    //size test
                    // croppedImage = croppedImage.createScaledBitmap(croppedImage, activeBmp.getWidth(), ((activeBmp.getWidth() * activeBmp.getHeight()) / activeBmp.getWidth()), true);
                    croppedImageView.setVisibility(View.VISIBLE);


                    croppedImageView.setImageBitmap(croppedImage);
                    activeBmp = croppedImage;
                    globalVar.edgeData= cropImageView.getEdge();
                    globalVar.gatheredData= cropImageView.getCircleData();
                    cropped=true;
                    
                    else
                    
                        Toast.makeText(MainActivity.this, "Please select your desired image before using the cropping function.", Toast.LENGTH_LONG).show();
                    
              
        );

        btProceed = (ImageButton)findViewById(R.id.btProceed);
        btProceed.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View arg0) 
                // TODO Auto-generated method stub
                if(cropImageView.getVisibility() == View.VISIBLE)
                    if(cropped)
                    
                    try 
                        InternalStorage.writeBitmap(MainActivity.this,"image", activeBmp);
                        InternalStorage.writeBitmap(MainActivity.this,"originalimage", originalBmp);

                        Intent intent = new Intent(MainActivity.this, EditImageActivity.class);
                        startActivity(intent);
                     catch (IOException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                    
                    else
                    
                        Toast.makeText(MainActivity.this, "Please crop your desired image before proceeding to the next step.", Toast.LENGTH_LONG).show();
                    
                
                else
                
                    Toast.makeText(MainActivity.this, "Please select your desired image before proceeding to the next step.", Toast.LENGTH_LONG).show();
                

            

        );



        if (savedInstanceState != null) 
            // String savedText = savedInstanceState.getString(KEY_TEXT_VALUE);
            if (!savedInstanceState.getString("filepath").equals("")) 
                filepath = savedInstanceState.getString("filepath");
                // mTextView.setText(savedText);
                LoadPicture(filepath);
                    croppedImageView.setImageBitmap(globalVar.CroppedImage);
                croppedImageView.setVisibility(View.VISIBLE);
                cropImageView.setVisibility(View.VISIBLE);
            
        

    

protected void onSaveInstanceState(Bundle bundle) 
    super.onSaveInstanceState(bundle);
    bundle.putInt(ASPECT_RATIO_X, mAspectRatioX);
    bundle.putInt(ASPECT_RATIO_Y, mAspectRatioY);
    // if (!filepath.equals("")) 
    if (filepath != null) 
        bundle.putString("filepath", filepath);
     else 
        bundle.putString("filepath", "");
    
    if(cropped==true)
    
        globalVar.CroppedImage= Bitmap.createBitmap(croppedImage);
    






@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;



@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId();
    if(id == R.id.About_Us)
    
        openDialog();
    

    return super.onOptionsItemSelected(item);




//cf code here

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    try 
        if (requestCode == GALLERY_CHOOSER_INTENT) 
            if (null == data) return;

            String selectedImagePath;
            Uri selectedImageUri = data.getData();

            //MEDIA GALLERY
            selectedImagePath = ImageFilePath.getPath(getApplicationContext(), selectedImageUri);

            cropImageView.requestLayout();
            LoadPicture(selectedImagePath);
            cropImageView.setVisibility(View.VISIBLE);
         
         if(requestCode ==CAMERA_IMAGE)
               

             if (resultCode == Activity.RESULT_OK) 

                    cropImageView.requestLayout();
                    // if(!filepath.equals(""))
                    if (outPutfileUri.toString() != null) 
                          this.filepath=outPutfileUri.getPath();
                        LoadPicture(outPutfileUri.getPath());
                        cropImageView.setVisibility(View.VISIBLE);

                    
             


            




     catch (Throwable ex) 
        //Toast.makeText(MainActivity.this, ex.toString(), Toast.LENGTH_LONG).show();

    




public String getGalleryImagePath(Intent data) 
    try 
        Uri imgUri = data.getData();
        String filePath = "";
        if (data.getType() == null) 
            // For getting images from default gallery app.
            String[] filePathColumn =  MediaStore.Images.Media.DATA ;
            Cursor cursor = getContentResolver().query(imgUri,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);
            cursor.close();
         else if (data.getType().equals("image/jpeg")
                || data.getType().equals("image/png")) 
            filePath = imgUri.getPath();
        
        return filePath;
     catch (Exception e) 
        return null;
    




private String getPath(Uri uri) 
    if( uri == null ) 
        return null;
    

    String[] projection =  MediaStore.Images.Media.DATA ;

    Cursor cursor;
    if(Build.VERSION.SDK_INT >19)
    
        // Will return "image:x*"
        String wholeID = DocumentsContract.getDocumentId(uri);
        // Split at colon, use second item in the array
        String id = wholeID.split(":")[1];
        // where id is equal to             
        String sel = MediaStore.Images.Media._ID + "=?";

        cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                                      projection, sel, new String[] id , null);
    
    else
    
        cursor = getContentResolver().query(uri, projection, null, null, null);
    
    String path = null;
    try
    
        int column_index = cursor
        .getColumnIndex(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        path = cursor.getString(column_index).toString();
        cursor.close();
    
    catch(NullPointerException e) 

    
    return path;


public String getCameraImagePath(Intent data) 
    try 
        Uri imgUri = data.getData();
        String filePath = "";
        if (data.getType() == null) 
            // For getting images from default gallery app.
            String[] filePathColumn =  MediaStore.Images.Media.DATA ;
            Cursor cursor = getContentResolver().query(imgUri,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);
            cursor.close();
         else if (data.getType().equals("image/jpeg")
                || data.getType().equals("image/png")) 
            filePath = imgUri.getPath();
        
        return filePath;
     catch (Exception e) 
        return null;
    



public void LoadPicture(String filepath) 

    if (!new File(filepath).exists()) 
        Toast.makeText(this, "Image does not exist.", Toast.LENGTH_SHORT)
                .show();
     else 

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int screenwidth = size.x;
        int screenheight = size.y;

        int picwidth = 0;
        if(screenwidth < screenheight)
        
            picwidth = screenwidth;
        
        else
        
            picwidth = screenheight;
        
        picwidth = (int) (0.8 * picwidth);

        Bitmap img = decodeSampledBitmapFromResource(filepath, picwidth);

        if (img.getWidth() < img.getHeight()) 
            Bitmap rotatedbmp = RotateBitmap(img, 90);
            img = rotatedbmp;
         else 
            ;
        
        if (img.getWidth() > img.getHeight()) 
            if (img.getWidth() > picwidth) 
                cropImageView.getLayoutParams().height = picwidth
                        * img.getHeight() / img.getWidth();
                cropImageView.getLayoutParams().width = picwidth;

                img = Bitmap.createScaledBitmap(img, picwidth,
                        ((picwidth * img.getHeight()) / img.getWidth()), true);
             else 
                cropImageView.getLayoutParams().width = img.getWidth();
                cropImageView.getLayoutParams().height = img.getHeight();
            

         else if (img.getHeight() > img.getWidth()) 
            if (img.getHeight() > picwidth) 
                cropImageView.getLayoutParams().height = picwidth;
                cropImageView.getLayoutParams().width = picwidth
                        * img.getWidth() / img.getHeight();

                img = Bitmap.createScaledBitmap(img,
                        ((picwidth * img.getWidth()) / img.getHeight()), picwidth,
                        true);
             else 
                cropImageView.getLayoutParams().width = img.getWidth();
                cropImageView.getLayoutParams().height = img.getHeight();
            
         else // same square image
            if (img.getWidth() > picwidth) 
                cropImageView.getLayoutParams().height = picwidth;
                cropImageView.getLayoutParams().width = picwidth;
                img = Bitmap.createScaledBitmap(img, picwidth, picwidth, true);
             else 
                cropImageView.getLayoutParams().width = img.getWidth();
                cropImageView.getLayoutParams().height = img.getHeight();
            
        
        activeBmp = null;
        activeBmp = img.copy(Bitmap.Config.ARGB_8888, true);
        originalBmp=img.copy(Bitmap.Config.ARGB_8888, true);



        //cropImageView.getLayoutParams().height = activeBmp.getHeight();
        //cropImageView.getLayoutParams().width = activeBmp.getWidth();
        cropImageView.setImageBitmap(activeBmp);

        //croppedImageView.setImageBitmap(activeBmp);
        img.recycle();


    //else ends


public static Bitmap decodeSampledBitmapFromResource(String filepath,int reqWidth) 

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filepath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(filepath, options);

public static Bitmap RotateBitmap(Bitmap source, float angle) 
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(),
            source.getHeight(), matrix, true);

public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth) 
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    // if (height > reqHeight || width > reqWidth) 
    if (width > reqWidth) 
        // final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and
        // keeps both
        // height and width larger than the requested height and width.
        // while ((halfHeight / inSampleSize) > reqHeight
        // && (halfWidth / inSampleSize) > reqWidth) 
        while ((halfWidth / inSampleSize) > reqWidth) 
            inSampleSize *= 2;
        
    

    return inSampleSize;


public void openDialog() 

    final AboutUsDlg dialog = new AboutUsDlg(this); // context, this etc.
    dialog.setTitle("About Us");

    Button btnClose = (Button) dialog.findViewById(R.id.btOk);

    btnClose.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 
            dialog.dismiss();
        

    );


    dialog.show();



 public void getFromGallery()

    //cf code

     /*
     if (Build.VERSION.SDK_INT <23)
        final Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, GALLERY_CHOOSER_INTENT);
     else 
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED);
    
    */
     final Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select File"),GALLERY_CHOOSER_INTENT);

    //final Intent intent = new Intent();
    //intent.setType("image/*");
    //intent.setAction(Intent.ACTION_GET_CONTENT);
    //startActivityForResult(intent, GALLERY_CHOOSER_INTENT);


public void getImageFromCamera()

    Intent intent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    file = new File(Environment.getExternalStorageDirectory(),
            "APDColonyImage.jpg");
    globalVar.CameraImage=file;
            outPutfileUri = Uri.fromFile(file);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, outPutfileUri);
            startActivityForResult(intent, CAMERA_IMAGE);







 public void openDialoginstruction() 

      cb_savePreferencedialog.setOnClickListener(new OnClickListener() 

          @Override
          public void onClick(View v) 
                    //is chkios checked?
            if (((CheckBox) v).isChecked()) 

                checkedCheckboxdialog=true;
            
            else 
            
                checkedCheckboxdialog=false;
            


          
        );



        Button btnClose = (Button) dialog.findViewById(R.id.btOk);

        btnClose.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                if(checkedCheckboxdialog==true)

                     SharedPreferences.Editor CheckBoxEditor = getSharedPreferences(Save_CheckboxSettingdialog, MODE_PRIVATE).edit();
                     CheckBoxEditor.putBoolean("CheckBoxValueDialog1", checkedCheckboxdialog);
                     CheckBoxEditor.commit();
                
                else
                
                    SharedPreferences.Editor CheckBoxEditor = getSharedPreferences(Save_CheckboxSettingdialog, MODE_PRIVATE).edit();
                    CheckBoxEditor.clear();
                    CheckBoxEditor.commit();
                
                dialog.dismiss();
            

        );

        dialog.show();

    



 public boolean onKeyDown(int keyCode, KeyEvent event) 
        // cleanup app, save preferences, etc.
     exitApplication() ;
        // finish(); // not working properly, especially not with asynchronous tasks running
        // return moveTaskToBack(true);
        return super.onKeyDown(keyCode, event);
    

 public void exitApplication() 

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Are you sure you want to exit?")

                // Write the code below
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() 
                            @Override
                            public void onClick(DialogInterface dialog, int id) 

                                finish();

                            
                        )

                .setNegativeButton("No", new DialogInterface.OnClickListener() 
                    public void onClick(DialogInterface dialog, int id) 

                    
                );

        AlertDialog alertDialog = builder.create();
        alertDialog.show();

    

我的activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity">

<ScrollView
    android:layout_
    android:layout_
     android:orientation="vertical"
     >

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical" >


          <LinearLayout
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:orientation="horizontal"
            android:weightSum="3" >

            <ImageButton
                android:id="@+id/btImage"
                android:layout_
                android:layout_
                android:layout_toLeftOf="@+id/btCrop"
                android:layout_weight="1"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:src="@drawable/getimage_icon9" />

            <ImageButton
                android:id="@+id/btCrop"
                android:layout_
                android:layout_
                android:layout_centerInParent="true"
                android:layout_weight="1"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:src="@drawable/crop_icon9" />

            <ImageButton
                android:id="@+id/btProceed"
                android:layout_
                android:layout_
                android:layout_toRightOf="@+id/btCrop"
                android:layout_weight="1"
                android:adjustViewBounds="true"
                android:scaleType="fitCenter"
                android:src="@drawable/next_icon9" />
        </LinearLayout>

        <TextView
            android:id="@+id/tvCrop1"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="@string/Image"
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <!--
        <com.edmodo.cropper.CropImageView
            xmlns:custom="http://schemas.android.com/apk/res-auto"
            android:id="@+id/CropImageView"
            android:layout_
            android:layout_
            android:layout_gravity="center_horizontal" />
        -->

        <com.edmodo.cropper.CropImageView
            xmlns:custom="http://schemas.android.com/apk/res-auto"
            android:id="@+id/CropImageView"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            custom:imageResource="@drawable/emptyimage"/>

        <TextView
            android:id="@+id/tvCrop2"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="@string/Cropped_image"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ImageView
            android:id="@+id/croppedImageView"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:src="@drawable/emptyimage"
            tools:ignore="ContentDescription" />

    </LinearLayout>


</ScrollView>

【问题讨论】:

minimal reproducible example - 也许重新考虑发布代码的数量。您发布的所有内容都很重要吗? 是的,因为类中的所有 R 符号都存在问题,并且类中还有其他我似乎无法解决的错误。 @franiis 您是否也将 R 导入粘贴到您的问题中?此外,问题似乎是另一回事。 com.apd.colonyapp。您还可以尝试删除当前的导入,然后通过 Android Studio 建议导入正确的 R,它应该是:import your.package.name.R; 然后重新构建清理项目。 正确检查您的 xml 文件。您的任何 xml 文件中都一定有问题。还要检查 Android Studio 中的 build 部分,如果有的话,它会给你错误。并且在清理项目后尝试重建项目。 @sanjay 我在构建部分得到的错误是“错误:找不到属性'com.apd.colonyapp:imageResource'。消息种类=错误,文本=错误:属性'com。 apd.colonyapp:imageResource' 未找到。,来源=[C:\Users\KUROYUKI\Downloads\ColonyCounter\ColonyCounter\ColonyAppLite\ColonyAppLite\app\src\main\res\layout\activity_main.xml:73],原始消息= , tool name=Optional.of(AAPT) " 我不明白这个错误。 【参考方案1】:

只需清理构建并重新运行项目。它会自动解决问题

【讨论】:

以上是关于无法解析 R 符号和方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法解析符号“R”? [复制]

R.id 给出错误“无法解析符号'R'”[重复]

迁移到 Androidx 后无法解析符号 R

更改 Min Sdk 版本后“无法解析符号 'R'”? [复制]

无法解析符号 R

错误“无法解析符号 R”仅在一个文件中