2011-11-30 13 views
32

Mam klasę, która obecnie rozszerza działanie i mam metody takie jak findViewById, ArrayAdapter itp. Chcę zamienić go w niezależną klasę, ale wszystkie powyższe metody stają się niezdefiniowany. Jaki jest problem? Czy zaimportowanie klas nie powinno wystarczyć? Na przykład importuję android.view.View dla findViewById, ale nadal nie ma znaczenia. Proszę doradzić.używanie findviewbyid w klasie, która NIE rozszerza aktywności w Androidzie

Odpowiedz

59

należy przekazać instancję swojej działalności do drugiej klasy w konstruktorze tak:

W swojej Activity instanciate klasie tak:

MyClass instance = new MyClass(this); 

aw swojej drugiej klasie, konstruktor będzie tak:

public class MyClass { 

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

public MyClass(Activity _activity){ 

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

} 
} 

i wtedy, gdy chcesz użyć findViewById() sposób można zrobić tak:

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

To nie działa. findViewById można wywoływać tylko w działaniu, a nie w kontekście. Próbowałem Twojego podejścia, ale nadal dawało mi błędy. – Namratha

+0

Więc zobacz moją edycję, po prostu przekaż instancję Interwencji Aktywności Kontekstu :) – Houcine

+0

Ok, zrobiłem to :) Kiedy wołam findViewById na obiekcie Activity, Listiew, który próbuję znaleźć, jest NULL. Czy to dlatego, że wcześniej nie użyłem setContentView dla pliku XML zawierającego ListView? – Namratha

6

findViewById nie jest statyczna metoda publiczna Activity klasy, więc on dostępny tylko dla Activityobiektu. W związku z tym import android.view.View i android.app.Activity nie udostępni go. Aby go udostępnić, możesz przekazać obiekt o wartości Actvity - zazwyczaj w swojej aktywności jest to punkt this. Należy jednak zauważyć, że zawsze należy zaktualizować widok w wątku interfejsu użytkownika.

+0

Ok rozumiem, dlaczego to nie jest dostępny, ale nie jest findViewById metodę zdania klasie? Czy mógłbyś również wyjaśnić, dlaczego powinniśmy zawsze aktualizować nasz widok w wątku interfejsu użytkownika (czy odnosisz się do głównej czynności?)? – Namratha

8

jeśli chcesz wywołać dowolną funkcję, która należy do Activity następnie Jedyne co musisz mieć to kontekst Activity.

np.

class A extends Activity{ 

Context ctx; 
void oncreate(Bundle b) 
ctx = this; 

B bob = new B(ctx); 
} 
} 

Oto klasa B.

Class B 
{ 
B(Activity a) 
{ 
a.anyFunctionOfActivity(); 
} 

} 
+1

To nie zadziała w AsyncTask –

+0

@IgorGanapolsky tutaj. Co należy zrobić, aby działało to w programie AsyncTask? –

0

Spróbuj wykonać następujące czynności:

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); 
Powiązane problemy