问题
I know there are some topics in StackOverFlow asking this But all of them are answering in special cases No one answers this question generally.
Can anyone say how to use findViewById in non activity classes?
For Example in my case I want to define a webview:
WebView view=(WebView)findViewById(R.id.webview);
But I can't and I really don't understand why android makes everything complicated.Why you can use everything in main activity but you can't use many of them in non activity class :(
UPDATE
I can't extend my class as activity cause it extends sth else.
UPDATE
This is the class:
class DownloadTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... sUrl) {
...
WebView view=(WebView)findViewById(R.id.webview);
final Snackbar snackbar = Snackbar.make(view,"message",Snackbar.LENGTH_LONG);
...
}
}
I'm gonna use the webview in a Snackbar.
回答1:
Can anyone say how to use findViewById in non activity classes?
Pass the activity into the method you are calling on the non-activity class.
Or, pass the activity into the constructor of the non-activity class.
Or, call findViewById()
in the activity and pass the WebView
to the non-activity class.
Plenty of other patterns exist. You need to be careful that you do not try using the activity or WebView
longer than you should (e.g., after the user rotates the screen, presses BACK, or otherwise causes the activity to be destroyed).
I'm gonna use the webview in a Snackbar.
Using a Snackbar
is fine. Using one from an AsyncTask
is not, unless you do so very carefully. In particular:
Only try doing this from the main application thread (i.e., not
doInBackground()
)Make sure that you are handling configuration changes, BACK presses, and the like properly. In particular, you cannot show a
Snackbar
on a destroyed activity
回答2:
1-in non activity class:
public Context con;
public NonAct(Activity c){//NonAct = your non activity class name
this.con = c;
}
//in your class or function do this:
WebView view=(WebView)con.findViewById(R.id.webview);
2-call non activity class with sending context argumant:
NonAct n = new NonAct(YourActivity.this);
回答3:
try this
ClassName instance = new ClassName(this);
and starting of your class will look like this
public class ClassName extents to something {
public Activity activity;
//.... other attributes
public ClassName( Activity _activity){
this.activity = _activity;
//other initializations...
you can use findviewby id like this
WebView mywebview = (WebView)this.activity.findViewById(R.id.mywebview);
///// now do whatever u want
i hope this will help u.
回答4:
just look at this link u have to pass your view inflated to AsyncTask
findviewbyid in asyncTask
来源:https://stackoverflow.com/questions/42055627/findviewbyid-in-non-activity-class