2011-11-30 1 views
32

J'ai une classe qui est en train d'étendre Activity et j'ai des méthodes comme findViewById, ArrayAdapter etc. Je veux la transformer en une classe indépendante mais toutes les méthodes ci-dessus deviennent indéfini. Quel est le problème? L'importation des classes ne devrait-elle pas être suffisante? Par exemple, j'importe android.view.View pour findViewById mais cela ne fait aucune différence. S'il vous plaît aviser.en utilisant findviewbyid dans une classe qui N'EXTENUE PAS d'activité dans android

Répondre

59

vous devez passer l'instance de votre activité à votre deuxième classe sur le constructeur comme ceci:

Dans votre Activity Instancier votre classe comme ceci:

MyClass instance = new MyClass(this); 

Et dans votre deuxième classe, le constructeur sera comme ceci:

public class MyClass { 

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

public MyClass(Activity _activity){ 

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

} 
} 

et puis quand vous voulez utiliser le findViewById() méthode, vous pouvez le faire comme ceci:

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

Cela ne fonctionne pas. findViewById ne peut être appelé que sur Activité et non sur Contexte. J'ai essayé votre approche mais ça m'a quand même donné des erreurs. – Namratha

+0

Donc, voir mon édition, il suffit de passer l'instance de l'activité intstead du contexte :) – Houcine

+0

Ok, je l'ai fait :) Lorsque j'appelle findViewById sur l'objet Activity, le Listiew que j'essaie de trouver est NULL. Est-ce parce que je n'ai pas utilisé setContentView pour le fichier XML qui contient le ListView, avant? – Namratha

6

findViewById est méthode publique non statique de la classe Activity, il ne sera disponible que pour un Activityobjet. Par conséquent, l'importation android.view.View et android.app.Activity ne le rendra pas disponible. Pour le rendre disponible, vous pouvez faire circuler un objet Actvity - généralement un point this dans votre activité. Toutefois, notez que vous devez toujours mettre à jour votre vue dans le thread d'interface utilisateur.

+0

Ok je comprends pourquoi il est pas disponible, mais est findViewById pas une méthode de la classe View? Aussi pourriez-vous expliquer pourquoi nous devrions toujours mettre à jour notre vue dans le fil de l'interface utilisateur (faites-vous référence à l'activité principale?)? – Namratha

8

si vous voulez appeler une fonction qui appartient à Activity alors seule chose que vous devez avoir est le contexte de la Activity.

par ex.

class A extends Activity{ 

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

B bob = new B(ctx); 
} 
} 

est ici classe B.

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

} 
+1

Cela ne fonctionnerait pas dans un AsyncTask –

+0

@IgorGanapolsky même ici. Que devrait-on faire pour que cela fonctionne dans AsyncTask? –

0

S'il vous plaît essayez ce qui suit:

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); 
Questions connexes