findViewById在非活动类中

时间:2017-02-05 18:25:18

标签: android android-activity android-webview findviewbyid

我知道StackOverFlow中有一些主题要求这样但是所有这些主题都在特殊情况下回答没有人一般回答这个问题。
谁能说如何在非活动类中使用findViewById? 在我的例子中,我想定义一个webview:

WebView view=(WebView)findViewById(R.id.webview);

但是我不能而且我真的不明白为什么android会使一切变得复杂。为什么你可以在主要活动中使用所有东西但是你不能在非活动类中使用它们中的许多:(
更新
我无法将我的课程扩展为活动,因为它延伸了其他。
更新
这是班级:

        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);
        ...
    }
}

我将在Snackbar中使用webview。

4 个答案:

答案 0 :(得分:2)

  

有谁能说如何在非活动类中使用findViewById?

将活动传递给您在非活动类上调用的方法。

或者,将活动传递给非活动类的构造函数。

或者,在活动中调用findViewById()并将WebView传递给非活动类。

存在许多其他模式。您需要注意不要尝试使用活动或WebView超过应有的时间(例如,在用户旋转屏幕后,按BACK或以其他方式导致活动被销毁)。

  

我将在Snackbar中使用webview。

使用Snackbar很好。使用AsyncTask中的一个不是,除非你这么做非常小心。特别是:

  • 只尝试从主应用程序线程执行此操作(即,不是doInBackground()

  • 确保正确处理配置更改,BACK印刷等。特别是,您无法在已销毁的活动上显示Snackbar

答案 1 :(得分:1)

1 - 非活动课程:

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);

答案 2 :(得分:0)

试试这个

ClassName instance = new ClassName(this);

并且您的课程的开头将如下所示

public class ClassName extents to something {

public Activity activity; 
//.... other attributes 

public ClassName( Activity _activity){

   this.activity = _activity;
//other initializations...

你可以像这样使用findviewby id

WebView mywebview = (WebView)this.activity.findViewById(R.id.mywebview);

/////现在做你想做的事

我希望这会对你有所帮助。

答案 3 :(得分:0)

只需查看此链接,您必须将您的视图传递给AsyncTask

findviewbyid in asyncTask