2010-03-20 9 views
1

J'essaie d'écrire un test unitaire pour RelativeLayout de mon Android. À l'heure actuelle, ma configuration TestCode est la suivante:Configuration de l'unité RelativeLayout d'Android

public class SampleRelativeLayoutTest extends AndroidTestCase { 

private ViewGroup testView; 

private ImageView icon; 
private TextView title; 


@Override 
protected void setUp() throws Exception { 
    super.setUp(); 
    // inflate the layout 
    final Context context = getContext(); 
    final LayoutInflater inflater = LayoutInflater.from(context); 
    testView = (ViewGroup) inflater.inflate(R.layout.sample_layout, 
      null); 
    // manually measure and layout 
    testView.measure(500, 500); 
    testView.layout(0, 0, 500, 500); 
    // init variables 
    icon = (ImageView) testView.findViewById(R.id.icon); 
    title = (TextView) testView.findViewById(R.id.title); 
} 

Cependant, je rencontrais NullPointerException avec la trace de pile suivante

java.lang.NullPointerException 
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:427) 
at android.view.View.measure(View.java:7964) 
at com.dqminh.test.view.SampleRelativeLayoutTest.setUp(SampleRelativeLayoutTest.java:33) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) 

Que dois-je changer dans mon setUp() code pour effectuer le test correctement?

+0

Cela a fonctionné comme un charme pour moi: http://stackoverflow.com/a/6086510/1293704 – Primoz990

Répondre

1

J'ai une copie de la source Android, mais je ne sais pas si c'est la même chose que ce que vous êtes sur (ou peut-être pour cette classe, peu importe). L'exception est une exception NullPointerException à la ligne 427 de RelativeLayout dans la méthode onMeasure. Cette ligne dans la version que j'ai est le premier accès de la variable d'instance mLayoutParams dans la méthode onMeasure. Est-il possible que vous ayez oublié d'ajouter les paramètres layout_width et layout_height dans votre mise en page xml ou quelque chose comme ça?

+0

Merci, en effet j'ai raté les paramètres de mise en page. Après l'ajout: testView.setLayoutParams (new LayoutParams (500,500)); le code fonctionne correctement :-) – dqminh

0

Fonctionne également si vous enveloppez votre RelativeLayout dans un LinearLayout. et passez la Linearlayout à la place.

0

Je ferai un comité d'entreprise:

LayoutParams layoutParams = new LayoutParams(500,500); 
testView.setLayoutParams(layoutParams); 
testView.layout(0, 0, 500, 500); 
0

Une autre raison possible est que vous avez une dépendance circulaire entre la taille de la RelativeLayout et la position de ses enfants. Par exemple, vous avez un RelativeLayout dont la hauteur est définie sur WRAP_CONTENT et un enfant sur ALIGN_PARENT_BOTTOM.

Ci-dessous figure l'annotation de RelativeLayout:

Une mise en page où les positions des enfants peuvent être décrits dans rapport à l'autre ou au parent. Par souci d'efficacité, les relations entre les vues sont évaluées en une passe, donc si la vue Y est en fonction de la position de la vue X, assurez-vous que la vue X arrive en premier dans la mise en page.

Notez que vous ne pouvez pas avoir de dépendance circulaire entre la taille du RelativeLayout et la position de ses enfants. Par exemple, vous ne pouvez pas avoir un RelativeLayout dont la hauteur est définie sur WRAP_CONTENT et un enfant sur ALIGN_PARENT_BOTTOM.

Voir également RelativeLayout.LayoutParams pour les attributs de disposition.

Questions connexes