【问题标题】:How to convert this activity to fragment如何将此活动转换为片段
【发布时间】:2023-03-23 14:12:01
【问题描述】:

我正在尝试将我的活动转换为片段,但我遇到了一些错误,有人可以指出我哪里出了问题以及如何解决它 我将向您展示发生错误的代码,但首先是错误

首先getApplicationContext getContentResolverRESULT_OK 收到“无法解析方法”错误

其次,UploadFrag.this 得到错误的参数错误

片段是您选择图像并将其上传到我的工作服务器的活动


package com.smartpractice.myapplication;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Base64;

import android.view.LayoutInflater;
import android.view.View;

import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

import androidx.fragment.app.Fragment;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Objects;

public class UploadFrag extends Fragment implements View.OnClickListener {

public static final String UPLOAD_URL = "https://www.smsjsjjsjs.co.za/files-upload-ruben.asp?MyForm=Yes";
public static final String UPLOAD_KEY = "image";

private int PICK_IMAGE_REQUEST = 1;

private Button buttonChoose;
private Button buttonUpload;

private ImageView imageView;
private Bitmap bitmap;
private Uri filePath;

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    return inflater.inflate(R.layout.activity_upload, container, false);
}
@Override
public void onStart() {
        super.onStart();

        init();
        }
        private void init(){
        buttonChoose = getView().findViewById(R.id.btnChoose);
        buttonUpload = getView().findViewById(R.id.btnUpload);

        imageView = getView().findViewById(R.id.imageView);

        buttonChoose.setOnClickListener(this);
        buttonUpload.setOnClickListener(this);
        }
private void showFileChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
        }

错误无法解析 RESULT_OK 上的符号 并且无法解析 getContentResolver 上的方法

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE_REQUEST && resultCode ==* RESULT_OK* && data != null && data.getData() != null) {
        filePath = data.getData();
        try {
        bitmap = MediaStore.Images.Media.getBitmap(*getContentResolver()*, filePath);
        imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
 }
public String getStringImage(Bitmap bmp){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        return Base64.encodeToString(imageBytes, Base64.DEFAULT);
        }

private void uploadImage(){
@SuppressLint("StaticFieldLeak")
class UploadImage extends AsyncTask<Bitmap,Void,String> {
    private ProgressDialog loading;
    private RequestHandler rh = new RequestHandler();

error UploadFrag.this 得到第一个错误的参数类型

@Override
protected void onPreExecute() {
    super.onPreExecute();
    loading = ProgressDialog.show(*UploadFrag.this,* "Uploading Image", "Please wait...",true,true);
}

错误 getApplicationContext 无法解析方法

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        loading.dismiss();
        Toast.makeText(*getApplicationContext()*,s,Toast.LENGTH_LONG).show();
    }

    @RequiresApi(api=Build.VERSION_CODES.KITKAT)
    @Override
    protected String doInBackground(Bitmap... params) {
        Bitmap bitmap = params[0];
        String uploadImage = getStringImage(bitmap);

        HashMap<String,String> data = new HashMap<>();
        data.put(UPLOAD_KEY, uploadImage);
        data.put("name",getFileName(filePath));

        return rh.postRequest(UPLOAD_URL,data);
    }
}

    UploadImage ui = new UploadImage();
        ui.execute(bitmap);
                }

error UploadFrag.this 获得第二个错误的参数类型,无法解析 makeText 上的方法

@Override
public void onClick(View v) {
        if (v == buttonChoose) {
        showFileChooser();
        }
        if(v == buttonUpload){
        if(filePath!=null) {
        uploadImage();
        } else {
        *Toast.makeText(UploadFrag.this,"Select Image",Toast.LENGTH_LONG).show();*
        }
     }
  }

错误无法解析 getContentResolver 上的方法

@RequiresApi(api=Build.VERSION_CODES.KITKAT)
    String getFileName(Uri uri){
            String result = null;
            if (Objects.equals(uri.getScheme(), "content")) {
            try (Cursor cursor=*getContentResolver()*.query(uri, null, null, null, null)) {
            if (cursor != null && cursor.moveToFirst()) {
            result=cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
            }
            }
            }
            if (result == null) {
            result = uri.getPath();
            assert result != null;
            int cut = result.lastIndexOf('/');
            if (cut != -1) {
            result = result.substring(cut + 1);
            }
            }
            return result;
            }
    }

【问题讨论】:

  • 在片段中作为上下文使用 getActivity()
  • 一个问题中的问题太多。一般来说,activity有一些fragment没有的方法(例如getApplicationContext)。例如,请改用 getActivity.getApplicationContext()。与getContentResolver 相同。同样至于this 参数是因为您尝试使用它的方法不仅需要任何this,还需要某种特定类型的对象,片段不是,但Activity 是。
  • @Piyush 谢谢,好像成功了

标签: android android-studio android-activity fragment


【解决方案1】:

正如@Piyush 所说,在片段中使用getActivity() 作为上下文。

你可以这样使用它;

 getActivity().getContentResolver();
 getActivity().getApplicationContext 
 getActivity().RESULT_OK

【讨论】:

    【解决方案2】:

    如下所示替换你的错误

    getApplicationContext() with getActivity().getApplicationContext()
    
    getContentResolver() with getActivity().getContentResolver()
    
     RESULT_OK with getActivity().RESULT_OK
    
     UploadFrag.this  replace with getActivity();
    

    希望这会对你有所帮助。

    【讨论】:

      【解决方案3】:

      片段与活动有着根本的不同。在您提供的示例中,有一些活动,您打开一些活动以获取结果并传递数据和结果。

      在片段中,您有一个父活动并且可以“交换内容”。与活动不同,您可以拥有一个片段对象。所以不需要像onActivityResult这样的一些方法

      但在某些情况下,您需要从活动中获取一些方法。在这种情况下,只需致电getActivity() 即可获得。所以例如getApplicationContext()会变成getActivity().getApplicationContext()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多