Androidでアクティビティを拡張しないクラスでFindViewByIDを使用する
-
26-10-2019 - |
質問
現在、アクティビティを拡張しているクラスがあり、FindViewByID、ArrayAdapterなどの方法があります。独立したクラスに変えたいのですが、上記の方法はすべて定義されていません。何が問題ですか?クラスをインポートするだけで十分ではありませんか?たとえば、FindViewByIDのAndroid.view.viewをインポートしますが、それでも違いはありません。お知らせ下さい。
解決
アクティビティのインスタンスをこのようなコンストラクターの2番目のクラスに渡す必要があります。
あなたの中で 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);
他のヒント
属する関数を呼び出したい場合 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
クラスなので、aでのみ利用可能です 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);
所属していません StackOverflow