findViewById in non activity class

∥☆過路亽.° 提交于 2019-12-13 07:59:46

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!