web-dev-qa-db-ja.com

androidでActivityを拡張しないクラスでfindviewbyidを使用する

現在Activityを拡張しているクラスがあり、findViewById、ArrayAdapterなどのメソッドがあります。それを独立したクラスにしたいのですが、上記のメソッドはすべて未定義になります。何が問題ですか?クラスをインポートするだけでは十分ではありませんか?たとえば、findViewByIdのAndroid.view.Viewをインポートしますが、それでも違いはありません。お知らせ下さい。

38
Namratha

次のように、コンストラクタの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);
_
69
Houcine

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();
    }
}
8
N-JOY

findViewByIdActivityクラスの非静的パブリックメソッドであるため、Activityオブジェクトに対してのみ使用可能です。したがって、インポートAndroid.view.ViewおよびAndroid.app.Activityは利用できません。使用可能にするには、Actvityオブジェクト(通常はアクティビティのthisポイント)を渡すことができます。ただし、UIスレッドでビューを常に更新する必要があることに注意してください。

6
pierrotlefou

以下を試してください:

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);
0
Ali Bagheri