2011-11-30 14 views
32

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

findViewById

答えて

59

あなたはこのようなコンストラクタであなたの第二のクラスにあなたのアクティビティのインスタンスを渡す必要があります。

あなたActivityインスタンス化するあなたのクラスでは、次のように:

MyClass instance = new MyClass(this); 

そして、あなたの第二のクラスでは、コンストラクタは次のようになります。

public class MyClass { 

public Activity activity; 
//.... other attributes 

public MyClass(Activity _activity){ 

    this.activity = _activity; 
//other initializations... 

} 
} 

、その後、あなたはを使用したいときあなたは、あなたが持っている必要があります唯一の事はActivityの文脈でActivityに属している任意の関数をコールする場合

EditText txt = (EditText)this.activity.findViewById(R.id.txt); 
+1

これは機能しません。 findViewByIdは、ContextではなくActivityでのみ呼び出すことができます。私はあなたのアプローチを試みましたが、それでも私にエラーが出ました。 – Namratha

+0

私の編集を見て、ContextのActivity intsteadのインスタンスを渡してください:) – Houcine

+0

Ok、私はそれを行いました:) ActivityオブジェクトのfindViewByIdを呼び出すと、見つけようとしているListiewがNULLになります。これは、ListViewを含むXMLファイルに対してsetContentViewを使用していないためですか? – Namratha

6

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

+0

[OK]を、それはできないのですが、ViewクラスのメソッドをfindViewByIdされていない理由を私は理解できますか?また、UIスレッドで常にビューを更新する必要がある理由を説明することもできます(主なアクティビティを参照していますか?) – Namratha

8

:方法は、あなたはこのように行うことができます。

例えば、ここで

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

} 
+1

これはAsyncTaskでは機能しません。 –

+0

@IgorGanapolskyはここに同じです。 AsyncTaskでこの作業を行うには、何をすべきですか? –

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); 
関連する問題