2017-07-29 3 views
1

J'ai fait beaucoup de dialogue dans Android par java comme ci-dessous:Pourquoi les champs de classe Java (et les champs du gestionnaire d'événements) ne s'initialisent pas dans les boîtes de dialogue android et les vues personnalisées?

public class MyComponent extends LinearLayout { 

    // constructors that will call InitializeComponent after inflate layout 

    private View.OnClickListener PersistButton_OnClickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PersistRest(); 
     } 
    }; 

    private void PersistRest() { 
     int selectedIndex = RestTimePicker().getValue() - 1; 
     long selectedTimeSpan = predefinedDurationValues[selectedIndex]; 
     SecretaryManagerUtility.RegisterRestByDuration("", SecretaryManagerUtility.Me(), System.currentTimeMillis(), selectedTimeSpan); 
    } 

    @Override 
    protected void InitializeComponents() {  
     PersistButton().setOnClickListener(PersistButton_OnClickListener); 
     super.InitializeComponents(); 
    } 


    private Button m_PersistButton; 

    protected Button PersistButton(){ 
     if(m_PersistButton == null) 
      m_PersistButton = (Button)rootView.findViewById(R.id.PersistButton); 
     return m_PersistButton; 
    } 
} 

problème est la méthode PersistButton_OnClickListener.onClick jamais appelé après avoir cliqué sur le bouton PersistButton

mais si je change d'affectation onClick au-dessous de code, tout fonctionne bien:

PersistButton().setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PersistRest(); 
     } 
    }); 

pourquoi? Ce problème se produit uniquement dans la boîte de dialogue android et les vues personnalisées android

+0

FYI: le casing de Pascal en Java rend la lecture de votre code plus difficile. Pensez à respecter les conventions Java. – ChiefTwoPencils

Répondre

0

Je trouve la réponse, mais je m'excuse pour une question incorrecte. La méthode InitializeLayout() sera appelée dans le constructeur (j'utilise l'outil personnalisé pour générer des objets de vue à partir de xml)

le problème est que les champs Java ne seront PAS initialisés avant d'appeler le constructeur super(), et que les champs sont Nuls quand InitializeLayout () a été appelé