À L'Aide De La Vue.getParent() en Vue du constructeur
Pourquoi ne pas ce travail?
private ScrollView findScrollParent(View v)
{
if(v==null)
{
return null;
}
else if(v instanceof ScrollView)
{
return (ScrollView) v;
}
else
{
return findScrollParent((View)v.getParent());
}
}
CustomView(Context context, AttributeSet as)
{
super(context,as);
ScrollView sv = findScrollParent(this);
}
C'est mon fichier xml qui est gonflé:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:layout_height="wrap_content"
android:layout_width="wrap_content">
<com.myapp.CustomView android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
</LinearLayout>
</ScrollView>
</RelativeLayout>
Je veux avoir une référence à la scrollView dans la Vue personnalisée. Mon findScrollParent méthode trouve le LinearLayout
puis renvoie la valeur null. J'appelle cette méthode dans le View v
'constructeur, c'est que le problème?
OriginalL'auteur you786 | 2011-08-17
Vous devez vous connecter pour publier un commentaire.
Si vous appelez cela de l'avis du constructeur puis ça sera sûrement pas de parent encore assigné?
Aussi loin que je peux voir de l'écrémage de la source de l'attribut parent n'est pas défini jusqu'à ce que le point de vue est ajouté à la mère, à quel point il va faire quelque chose comme:
Donc, si vous êtes dans le constructeur de la vue, puis ma conjecture est que c'est trop tôt et la vue sera ajouté après il est construit. Je n'étais pas 100% sûr de ce que la combinaison de classes que vous parliez de /comment vous avez eu les assembler de manière peut-être regardé à la mauvaise source.
MODIFIER
Juste pour clarifier avec le pseudo code le processus pourrait ressembler à ceci
EDIT 2 - @codelark la suggestion de
Aussi, autant que je puis dire, de la Vue sont construits/instancié en mouvement à la baisse de la vue racine dans une hiérarchie. Si les points de Vue sont construits alors addView appelé sur eux, alors ma méthode de travail, n'est-ce pas?
Je ne sais pas encore exactement ce que vous essayez d'atteindre? Votre affichage personnalisé ne peut pas être ajouté à un groupe affichage jusqu'à ce qu'il a été construit, par conséquent, l'appel de getParent dans le constructeur est trop tôt.
Où êtes-vous en utilisant le résultat de la méthode? Quand avez-vous besoin d'une poignée sur le scrollView? Pouvez-vous ne pas l'attraper à un moment plus tard?
Au lieu de mettre dans le constructeur, vous pouvez paresseusement initialiser via un getter. De cette façon, vous n'essayez pas de l'utiliser jusqu'à ce qu'il est nécessaire, qui devrait être un moment de temps après la mère de définir l'attribut.
OriginalL'auteur Paul.s
Vous pouvez accéder en toute sécurité à votre mère dans onAttachedToWindow() la méthode.
Voir Vue Du Cycle De Vie.
OriginalL'auteur LanDenLabs