2011-11-30 71 views
32

我有一個類,目前正在擴展活動,我有像findViewById,ArrayAdapter等方法 我想把它變成一個獨立的類,但所有上述方法變成未定義。問題是什麼?不應該導入類是不夠的?例如,我爲findViewById導入android.view.View,但它仍然沒有區別。 請指教。在不擴展的類中使用findviewbyid活動在android

回答

59

您應該將活動的實例傳遞給你的第二個類的構造函數是這樣的:

在你Activity實例化的類是這樣的:

MyClass instance = new MyClass(this); 

而在你的第二級,在構造將是這樣的:

public class MyClass { 

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

public MyClass(Activity _activity){ 

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

} 
} 

,然後當你要使用的findViewById()方法,你可以這樣做:

EditText txt = (EditText)this.activity.findViewById(R.id.txt); 
+1

這不起作用。 findViewById只能在Activity上調用,而不能在Context上調用。我嘗試了你的方法,但它仍然給我錯誤。 – Namratha

+0

所以看到我的編輯,只是傳遞活動intstead實例的上下文:) – Houcine

+0

好吧,我做到了:)當我在Activity對象上調用findViewById時,我試圖找到的Listiew是NULL。那是因爲我之前沒有使用setContentView作爲包含ListView的XML文件嗎? – Namratha

6

findViewByIdActivity類的非靜態公共方法,所以它只可用於一個Activity對象。因此,進口android.view.Viewandroid.app.Activity不會使它可用。爲了使其可用,您可以傳遞Actvity對象 - 通常是您的活動中的一個this點。但是,請注意,您應始終在UI線程中更新視圖。

+0

好吧,我明白爲什麼這不是選擇,但是不findViewById View類的方法?你也可以解釋爲什麼我們應該總是在UI線程中更新視圖(你是指主要的Activity?)? – Namratha

8

如果你想調用屬於Activity那麼只有你需要有東西的任何功能是Activity的上下文。

例如。

class A extends Activity{ 

Context ctx; 
void oncreate(Bundle b) 
ctx = this; 

B bob = new B(ctx); 
} 
} 

這裏是B類

Class B 
{ 
B(Activity a) 
{ 
a.anyFunctionOfActivity(); 
} 

} 
+1

在這裏,這不會在AsyncTask –

+0

@IgorGanapolsky中工作。在AsyncTask中完成這項工作應該做些什麼? –

0

請嘗試以下方法:

public static View getLayoutByRes(@LayoutRes int layoutRes,@Nullable ViewGroup viewGroup) 
{ 
    final LayoutInflater factory = getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    return factory.inflate(layoutRes, viewGroup); 
} 

TextView tv = (TextView) getLayoutByRes(R.layout.xxx ,Null).findViewById(R.id.editd); 
相關問題