web-dev-qa-db-fra.com

utilisation de findviewbyid dans une classe qui ne prolonge pas l'activité dans Android

J'ai une classe qui étend actuellement Activity et j'ai des méthodes comme findViewById, ArrayAdapter, etc. Je veux la transformer en classe indépendante, mais toutes les méthodes ci-dessus ne sont plus définies. Quel est le problème? L'importation des classes ne devrait-elle pas suffire? Par exemple, j'importe Android.view.View pour findViewById mais cela ne fait toujours aucune différence . S'il vous plaît aviser.

33
Namratha

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

Dans votre Activity, instanciez 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 ensuite, lorsque vous souhaitez utiliser la méthode findViewById(), vous pouvez procéder comme suit: 

EditText txt = (EditText)this.activity.findViewById(R.id.txt);
66
Houcine

si vous voulez appeler une fonction appartenant à Activity, il vous suffira d'avoir le contexte de la Activity

par exemple.

class A extends Activity {
    Context ctx;

    void onCreate(Bundle b)
        ctx = this;
        B bob = new B(ctx);
    }
}

Voici la classe B.

class B {

    B (Activity a) {
        a.anyFunctionOfActivity();
    }
}
9
N-JOY

findViewById est une méthode publique non statique de la classe Activity et ne doit donc être disponible que pour une Activityobjet. Par conséquent, importer Android.view.View et Android.app.Activity ne le rendra pas disponible. Pour le rendre disponible, vous pouvez faire passer un objet Actvity - généralement un point this dans votre activité. Toutefois, notez que vous devez toujours mettre à jour votre vue dans le fil de l'interface utilisateur. 

6
pierrotlefou

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