現在Activityを拡張しているクラスがあり、findViewById、ArrayAdapterなどのメソッドがあります。それを独立したクラスにしたいのですが、上記のメソッドはすべて未定義になります。何が問題ですか?クラスをインポートするだけでは十分ではありませんか?たとえば、findViewByIdのAndroid.view.Viewをインポートしますが、それでも違いはありません。お知らせ下さい。
次のように、コンストラクタの2番目のクラスにアクティビティのインスタンスを渡す必要があります。
Activity
で、次のようにクラスをインスタンス化します。
_MyClass instance = new MyClass(this);
_
そして、2番目の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);