Android开发编译报错:找不到getActivity()方法,求代码修正方案
I see you're building your first Android app for your OsClass classifieds site, and ran into a compile error when implementing image upload via WebView. Let's break down the issue and fix it.
The Root Cause
The getActivity() method belongs to the Fragment class, but your MainActivity extends AppCompatActivity (an Activity subclass). When you tried to use getActivity() in your Activity code, the compiler couldn't find that method—hence the error. In an Activity, you can directly use MainActivity.this to get the valid Context object you need.
Corrected Full Code
Here's the fixed version of your code, where all invalid references to getActivity() have been replaced with MainActivity.this:
package org.satlyk.org.myapplication; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private String WebAddress = "https://satlyk.org"; private WebView webView; private ProgressBar progressBar; private FrameLayout frameLayout; private ValueCallback<Uri> mUploadMessage; public ValueCallback<Uri[]> uploadMessage; public static final int REQUEST_SELECT_FILE = 100; private final static int FILECHOOSER_RESULTCODE = 1; @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (requestCode == REQUEST_SELECT_FILE) { if (uploadMessage == null) return; uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); uploadMessage = null; } } else if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment // Use RESULT_OK only if you're implementing WebView inside an Activity Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } else Toast.makeText(MainActivity.this, "Failed to Upload Image", Toast.LENGTH_LONG).show(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frameLayout = (FrameLayout) findViewById(R.id.frameLayout); progressBar = (ProgressBar) findViewById(R.id.progressBar); progressBar.setMax(100); webView = findViewById(R.id.webView); WebSettings mWebSettings = webView.getSettings(); mWebSettings.setJavaScriptEnabled(true); mWebSettings.setSupportZoom(false); mWebSettings.setAllowFileAccess(true); mWebSettings.setAllowFileAccess(true); mWebSettings.setAllowContentAccess(true); webView.getSettings().setUserAgentString("satlyk_app"); webView.setWebViewClient(new HelpCliet()); webView.setWebChromeClient(new WebChromeClient() { // For 3.0+ Devices (Start) // onActivityResult attached before constructor protected void openFileChooser(ValueCallback uploadMsg, String acceptType) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE); } // For Lollipop 5.0+ Devices public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { if (uploadMessage != null) { uploadMessage.onReceiveValue(null); uploadMessage = null; } uploadMessage = filePathCallback; Intent intent = fileChooserParams.createIntent(); try { startActivityForResult(intent, REQUEST_SELECT_FILE); } catch (ActivityNotFoundException e) { uploadMessage = null; Toast.makeText(MainActivity.this, "Cannot Open File Chooser", Toast.LENGTH_LONG).show(); return false; } return true; } //For Android 4.1 only protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE); } protected void openFileChooser(ValueCallback<Uri> uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); } public void onProgressChanged (WebView view, int progress) { frameLayout.setVisibility(View.VISIBLE); progressBar.setProgress(progress); setTitle("Ýüklenýär..."); if (progress == 100) { frameLayout.setVisibility(View.GONE); setTitle(getTitle()); } } }); webView.loadUrl(WebAddress); } private class HelpCliet extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString()); return true; } } }
Key Modifications
- Replaced all instances of
getActivity().getApplicationContext()withMainActivity.this(sincegetActivity()is not available in an Activity class). This provides the correct Context for operations like showing Toasts and starting file chooser activities.
This should resolve the compile error and let your WebView image upload functionality work as intended.
内容的提问来源于stack exchange,提问作者Umar

