findViewById в классе View возвращает значение null, тогда как работает в классе Activity

Я относительно новичок в программировании под Android. Я просмотрел много тем по этой теме, но ни одно из упомянутых решений не работает для меня. Вот что я пытаюсь. Я пытаюсь создать ресурс макета с файлом XML, и в моем MainActivity я делаю setContentView (R.layout.activity_main). Затем у меня есть собственный класс представления, который расширяет представление, в котором я пытаюсь изменить макет по умолчанию, определенный в файле activity_main.xml. Однако каждый раз, когда я пытаюсь получить идентификатор представления с помощью findViewById (R.id.) (Из файла макета activity_main.xml) в пользовательском представлении, реализованном в отдельном файле, я всегда получаю значение null. Если я попытаюсь получить идентификатор в классе MainActivity с помощью findViewById (...), я получу правильное значение.
Что я здесь делаю не так?

Вот все фрагменты кода

Благодарность

Вот файл "MainActivity.java"

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);



    setContentView(R.layout.activity_main);

    MyView myView = new MyView(this, null);

      ....

Вот файл MyView.java

public class MyView extends View {

public static final String DEBUG_TAG = "MYVIEW" ;

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


    View tablerow1 = (TableRow) findViewById (R.id.tableRow) ;

    Log.v(DEBUG_TAG," tablerow1 = " + tablerow1 + "\n");



}

А вот и файл activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/top_layout"  
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"  >
<TableLayout  
android:id="@+id/tableLayout1"  
android:layout_width="match_parent"  
android:layout_height="0dp"
android:layout_weight="2"
android:background="@color/red"
android:shrinkColumns="*"  
android:stretchColumns="*" >  
<TableRow
    android:id="@+id/tableRow1"  
    android:layout_height="wrap_content"  
    android:layout_width="match_parent"  
    android:gravity="center_horizontal">  

    <Button  
        android:id="@+id/button_00_1"  
        android:text="@string/button_1"
        android:textStyle="bold"
        android:background="@color/green"
        android:layout_margin="0.5dp"
        android:layout_width="0dp"
        android:layout_weight="0.5"           
        android:typeface="serif"></Button> 
    </TableRow>  
  </TableLayout>
</LinearLayout>

Вызов findViewById (...) в MyView.java всегда возвращает значение null, тогда как, если я включаю его в файл MainActivity.java, я получаю правильные ненулевые значения.

Может кто-нибудь указать, что здесь не так?

Благодарность


person sri_s    schedule 05.11.2012    source источник


Ответы (1)


Вы можете легко получить доступ к любому представлению / макету из XML-макета вашего действия. Единственное, чего вам не хватает в вашем коде, это то, что вы пытаетесь выполнить findViewById () в MyView и пытаетесь получить доступ к другим представлениям Activity. Этот вызов будет работать только с представлением, заключенным в ваш MyView, а не за его пределами. Вы должны вызвать findViewByID () этого действия, для которого вы пытаетесь получить доступ к представлениям. Например:-

((Activity)context).findViewById(R.id.abc).setVisibility(View.VISIBLE);

В вашем случае вы можете сделать это так: -

public class MyView extends View {
   public static final String DEBUG_TAG = "MYVIEW" ;

   public MyView(Context context, AttributeSet attrs) {
   super(context, attrs);
   View tablerow1 = (TableRow) ((Activity)context).findViewById (R.id.tableRow) ;
   Log.v(DEBUG_TAG," tablerow1 = " + tablerow1 + "\n");
}
person Ethan Hunt    schedule 06.11.2012
comment
Большое спасибо. Я получил этот ответ после того, как искал этот и другие форумы в течение одного дня. Теперь работает !! - person sri_s; 06.11.2012