2011-11-30 57 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);