2014-01-09 1 views
1

Я следую примеру из книги, и я не понимаю, почему findViewById возвращает null.Android - findViewById возвращает null

Это моя активность:

package it.mt.compass; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.Toast; 

public class CompassActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     CompassView cv = (CompassView)this.findViewById(R.id.compassView1); 

     // this crashes the application 
     //cv.setBearing(45); 

     // some debug code 
     Toast test_result; 

     if(cv == null) { 
      test_result = Toast.makeText(this, "1", Toast.LENGTH_SHORT); 
      test_result.show(); 
     } 
     else { 
      test_result = Toast.makeText(this, "0", Toast.LENGTH_SHORT); 
      test_result.show(); 
     } 

     // it shows 1 
    } 
} 

и это Рез/макет/main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <it.mt.compass.CompassView 
     android:id="@+id/compassView1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
    /> 
</LinearLayout> 

уже очищен (как это было предложено в другом подобном тем, что делает "Clean" делать ?) проект без везения.

Большое спасибо заранее. Мирко

В соответствии с просьбой, код конструкторов:

// Constructors 


public CompassView(Context context) { 
     super(context); 
     initCompassView(); 
    } 

    public CompassView(Context context, AttributeSet attrs) { 
     super(context); 
     initCompassView(); 
    } 

    public CompassView(Context context, AttributeSet ats, int defaultStyle) { 
     super(context); 
     initCompassView(); 
    } 

Это правильная версия (проблема была я не прошел параметры правильно конструктора суперкласса):

// Constructors 


public CompassView(Context context) { 
     super(context); 
     initCompassView(); 
    } 

    public CompassView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initCompassView(); 
    } 

    public CompassView(Context context, AttributeSet ats, int defaultStyle) { 
     super(context, ats, defaultStyle); 
     initCompassView(); 
    } 
+1

Что говорит об ошибке? – Aiapaec

+1

Любые варианты ресурсов 'res/layout- {modifier}/main.xml' без компаса? – laalto

+1

Попробуйте «это». только CompassView cv = (CompassView) findViewById (R.id.compassView1); –

ответ

3

CompassView Ошибка реализации конструктора. Вы не передаете атрибуты суперклассам и, следовательно, теряется id.

Изменить здесь конструктор суперкласса вызов

public CompassView(Context context, AttributeSet attrs) { 
    super(context); 

к super(context, attrs);

и

public CompassView(Context context, AttributeSet ats, int defaultStyle) { 
    super(context); 

к super(context, attrs, defaultStyle);, если у суперкласса есть CTOR, который принимает три арг. В противном случае просто используйте super(context, attrs). О, и переименуйте имя arg от ats, хотя имя не имеет значения.

+0

Еще раз спасибо, это сработало. – jurko

1

В затмении do:

  • Проекты -> Чистота.
  • Eefresh ваше приложение.
  • Run.

это очистит сгенерированный старый R класс.

+0

Спрашивающий сказал, что уже сделал это. – hichris123

+0

Спасибо за ваш ответ. Я попробовал с Clean, но он все равно возвращает null. – jurko

0

Я бы попытался полностью закрыть затмение, а затем снова открыть его. Я видел некоторые действительно причудливые вещи, подобные этому. Другой способ, которым вы можете попробовать, это просто добавить «textView» и попытаться сделать findById на этом и посмотреть, возвращает ли он значение null. Вы можете быть загружая неправильный вид XML ..

т.е. ваш загружают макет из одного каталога, но это на самом деле загружается другой вид в другом каталоге с таким же именем ...

+0

Я выполнил перезагрузку машины. Это не сработало. Я добавил TextView и findViewById корректно работает с ним. – jurko

0

добавить import it.mt.compass.R; и попробуйте другой вид, например, изображение или текстовое изображение

+0

Я добавил TextView и findViewById корректно работает с ним, но мне все равно не повезло с моим CompassView – jurko

+0

. Посмотрите на это: http://stackoverflow.com/questions/1691569/findviewbyid-returns-null-for-custom-component- in-layout-xml-not-for-other-co –

+0

На самом деле это была ошибка с конструкторами, я не передал все параметры конструктору суперкласса. Спасибо! – jurko