在一个不扩展android中的Activity的类中使用findviewbyid

时间:2011-11-30 09:37:05

标签: android class android-activity findviewbyid

我有一个当前正在扩展Activity的类,我有findViewById,ArrayAdapter等方法。 我想将它变成一个独立的类,但所有上述方法都变得不确定。问题是什么?不应该导入类足够吗?例如,我为findViewById导入android.view.View但它仍然没有区别。 请指教。

4 个答案:

答案 0 :(得分:68)

你应该将你的Activity实例传递给构造函数中的第二个类,如下所示:

在你的Activity Instanciate your Class中:

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 :(得分: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();
    }
}

答案 2 :(得分:6)

findViewByIdActivity类的非静态公共方法,因此仅适用于Activity 对象。因此,导入android.view.Viewandroid.app.Activity不会使其可用。要使其可用,您可以传递Actvity个对象 - 通常是活动中的this点。但是,请注意,您应始终在UI线程中更新View。

答案 3 :(得分: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);