【发布时间】:2012-01-09 13:27:51
【问题描述】:
我有一个当前正在扩展 Activity 的类,并且我有 findViewById、ArrayAdapter 等方法。 我想把它变成一个独立的类,但是上面所有的方法都没有定义。问题是什么?导入类还不够吗?例如,我为 findViewById 导入 android.view.View 但它仍然没有区别。 请指教。
【问题讨论】:
标签: android class android-activity findviewbyid
我有一个当前正在扩展 Activity 的类,并且我有 findViewById、ArrayAdapter 等方法。 我想把它变成一个独立的类,但是上面所有的方法都没有定义。问题是什么?导入类还不够吗?例如,我为 findViewById 导入 android.view.View 但它仍然没有区别。 请指教。
【问题讨论】:
标签: android class android-activity findviewbyid
你应该像这样在构造函数上将你的 Activity 实例传递给你的 Second Class:
在你的Activity 中像这样实例化你的类:
MyClass instance = new MyClass(this);
在你的第二个 Class 中,constructor 将是这样的:
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);
【讨论】:
如果您想调用属于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();
}
}
【讨论】:
findViewById 是Activity 类的非静态公共方法,因此它只能用于Activity 对象。因此,导入 android.view.View 和 android.app.Activity 不会使其可用。要使其可用,您可以传递 Actvity 对象 - 通常是您活动中的 this 点。但是,请注意您应该始终在 UI 线程中更新您的视图。
【讨论】:
请尝试以下方法:
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);
【讨论】: