I have a class that is currently extending Activity and I have methods like findViewById, ArrayAdapter etc. I want to turn it into an independent class but all the above methods become undefined. What is the problem? Shouldn't importing the classes be enough? For eg, I import android.view.View for findViewById but it still makes no difference. Please advise.
you should pass the instance of your Activity to your Second Class on the constructor like this :
In your Activity
Instanciate your Class like this :
MyClass instance = new MyClass(this);
And in your second Class , the constructor will be like this :
public class MyClass {
public Activity activity;
//.... other attributes
public MyClass( Activity _activity){
this.activity = _activity;
//other initializations...
}
}
and then when you want to use the findViewById()
method , you can do like this :
EditText txt = (EditText)this.activity.findViewById(R.id.txt);
if you want to call any function that belongs to Activity
then only thing you need to have is context of the Activity
.
eg.
class A extends Activity {
Context ctx;
void onCreate(Bundle b)
ctx = this;
B bob = new B(ctx);
}
}
Here is class B.
class B {
B (Activity a) {
a.anyFunctionOfActivity();
}
}
findViewById is non-static public method of the Activity
Class ,so it only be available for a Activity
object. Therefore, import android.view.View
and android.app.Activity
won't make it available. To make it available, you could pass around a Actvity
object - usually a this
point in your activity. However, notice that you should always update your View in the UI thread.
Please try the following:
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);
来源:https://stackoverflow.com/questions/8323777/using-findviewbyid-in-a-class-that-does-not-extend-activity-in-android