2015-12-01 1 views
1

Je crée un View personnalisé qui nécessite la définition de quelques indicateurs dans les constructeurs. Les indicateurs ne sont définis nulle part ailleurs et sont enregistrés/restaurés dans les méthodes onSaveInstanceState et onRestoreInstanceState. Le problème est que lorsque j'essaie de l'utiliser, les drapeaux ne sont pas toujours définis. J'ai noté quel constructeur est utilisé pour chaque instance, mais il semble qu'il y ait des cas où aucun d'entre eux n'est utilisé. Je ne peux pas penser à un autre constructeur qui pourrait être appelé à la place.Les constructeurs ne sont pas appelés

public class TextViewCompat extends AppCompatTextView 
{ 
    private int constructor = 0; 
    private boolean isPreHoneycomb; 
    private boolean isPreJellybean; 

    public TextViewCompat(Context context) 
    { 
     this(context, null); 
     constructor = 1; 
    } 

    public TextViewCompat(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
     constructor = 2; 
    } 

    public TextViewCompat(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 

     isPreHoneycomb = Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB; 
     isPreJellybean = Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1; 

     constructor = 3; 
    } 

    @Override 
    public Parcelable onSaveInstanceState() 
    { 
     Log.d("Kevin", "onSaveInstanceState"); 
     Bundle bundle = new Bundle(); 
     bundle.putParcelable("instanceState", super.onSaveInstanceState()); 
     bundle.putBoolean("isPreHoneycomb", isPreHoneycomb); 
     bundle.putBoolean("isPreJellybean", isPreJellybean); 

     return bundle; 
    } 

    @Override 
    public void onRestoreInstanceState(Parcelable state) 
    { 
     Log.d("Kevin", "onRestoreInstanceState"); 
     if (state instanceof Bundle) 
     { 
      Bundle bundle = (Bundle) state; 
      isPreHoneycomb = bundle.getBoolean("isPreHoneycomb", Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB); 
      isPreJellybean = bundle.getBoolean("isPreJellybean", Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1); 

      state = bundle.getParcelable("instanceState"); 
     } 
     super.onRestoreInstanceState(state); 
    } 

    @Override 
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) 
    {  
     Log.d("Kevin", "================="); 
     Log.d("Kevin", "constructor=" + constructor); 
     Log.d("Kevin", "isPreJellybean=" + isPreJellybean); 
     Log.d("Kevin", "isPreHoneycomb=" + isPreHoneycomb); 
     Log.d("Kevin", "================="); 

     super.onTextChanged(text, start, lengthBefore, lengthAfter); 
    } 
} 

Je sais que ce serait assez facile pour moi de travailler autour de cette question dans ce cas, parce que les drapeaux peuvent être recalculés à tout moment. Mais le fait est que les constructeurs ne sont pas appelés et seraient un problème pour tout autre drapeau que je voudrais garder.

Remarque: Les vues sont gonflées à partir de xml au lieu d'être programmées et testées sur un émulateur et un périphérique API 10 (les deux indicateurs doivent être true).

+0

'super (contexte);' –

+0

'super (context, attrs);' –

+0

@MikeM. Je pense donc –

Répondre

0

Je trouve la question. J'imprime les drapeaux dans la méthode onTextChanged. Comme je gonfle la vue à partir de la mise en page (texte défini dans l'attribut attrs), le constructeur place le texte sur la ligne super(context, attrs, defStyle); et déclenche onTextChanged avant que les indicateurs soient définis.

Erreur idiote, mais merci pour l'un des commentaires qui m'a poussé dans la bonne direction.

+0

Content d'entendre le codage .Happy –

0

Vous pouvez essayer cette .pass super au lieu de this

public TextViewCompat(Context context) 
{ 
    super(context); 
    constructor = 1; 
} 

public TextViewCompat(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
    constructor = 2; 
} 
+1

Je l'ai déjà essayé, mais je l'ai essayé à nouveau maintenant. Le résultat est le même. – Kevin