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
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);
findViewById nie jest statyczna metoda publiczna Activity
klasy, więc on dostępny tylko dla Activity
obiektu. 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.
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
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();
}
}
To nie zadziała w AsyncTask –
@IgorGanapolsky tutaj. Co należy zrobić, aby działało to w programie AsyncTask? –
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);
- 1. Rozszerza AlertDialog.Builder w Androidzie
- 2. Jak używać setContentView (int) z klasy, która nie rozszerza działania
- 3. Zanikanie aktywności z poprzedniej aktywności w Androidzie
- 4. StartService z klasy, która nie rozszerza działania
- 5. Używanie 'virtual' w klasie pochodnej
- 6. Używanie konstruktora macierzystego w klasie podrzędnej w Javie
- 7. Android findViewById w usłudze
- 8. Używanie cURL w Androidzie
- 9. Używanie NanoHTTPD w Androidzie
- 10. Jak mogę odwołać się do metody super w klasie Java, która implementuje interfejs, ale nie rozszerza innej klasy?
- 11. Klasa Java, która rozszerza String (lub podobny)
- 12. Przenoszenie z jednej aktywności na inną Aktywność w Androidzie
- 13. Używanie onResume() do odświeżania aktywności
- 14. Używanie zewnętrznych czcionek w Androidzie
- 15. Czy mogę utworzyć adnotację Java, która "rozszerza" @SuppressWarnings?
- 16. Używanie jni w Androidzie: UNsatisfiedLinkError
- 17. Używanie klas BufferedImage i ImageIO w mojej aktywności Android
- 18. Android findViewById w DialogFragment
- 19. findViewById w DialogFragment - NullPointerException
- 20. Pobierz bieżący kontekst działania w klasie innej niż działalność
- 21. findViewById w ramach fragmentu
- 22. Jak korzystać z getContentResolver w klasie bez aktywności?
- 23. Używanie C++ w klasie Nazwa klasy;
- 24. Używanie ClassPathXmlApplicationContext w autonomicznej klasie Java
- 25. Czy można odwołać się do metody klasy abstrakcyjnej w metodzie klasy, która jej nie rozszerza?
- 26. Używanie inicjalizatora kolekcji w mojej własnej klasie
- 27. ImmutableList nie rozszerza listy?
- 28. wykonywanie pauzy aktywności, która nie została wznowiona po odtworzeniu metody
- 29. Używanie DefaultValueAttribute na klasie, która jest używana jako typ w MetadataTypeAttribute
- 30. Po ponownym utworzeniu aktywności w Androidzie pojawia się okno dialogowe.
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
Więc zobacz moją edycję, po prostu przekaż instancję Interwencji Aktywności Kontekstu :) – Houcine
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