Android layout 视图类中的findViewById返回null,而在活动类中工作

Android layout 视图类中的findViewById返回null,而在活动类中工作,android-layout,android-widget,android-view,android-custom-view,Android Layout,Android Widget,Android View,Android Custom View,我对Android编程比较陌生。关于这个话题,我已经讨论了很多话题,但是上面提到的解决方案都不适合我。这就是我正在尝试的。 我试图用一个XML文件创建一个布局资源,在我的MainActivity中,我执行一个setContentView(R.layout.activity_main)。然后,我有一个自定义视图类,该类扩展了视图,我试图在其中修改activity_main.xml文件中定义的默认布局。 但是,每当我试图在一个单独的文件中实现的自定义视图中获取具有findViewById(R.Id.

我对Android编程比较陌生。关于这个话题,我已经讨论了很多话题,但是上面提到的解决方案都不适合我。这就是我正在尝试的。 我试图用一个XML文件创建一个布局资源,在我的MainActivity中,我执行一个setContentView(R.layout.activity_main)。然后,我有一个自定义视图类,该类扩展了视图,我试图在其中修改activity_main.xml文件中定义的默认布局。 但是,每当我试图在一个单独的文件中实现的自定义视图中获取具有findViewById(R.Id.)(来自布局文件activity_main.xml)的视图Id时,我总是得到null。如果我尝试使用findViewById(…)获取MainActivity类中的id,我会得到一个正确的值。
我做错了什么

下面是所有的代码片段

谢谢

这是文件“MainActivity.java”

这是文件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>

MyView.java中的findViewById(…)调用始终返回null,而如果将其包含在MainActivity.java文件中,则会得到正确的非null值

有人能指出这里出了什么问题吗


谢谢

您可以从活动的布局xml轻松访问任何视图/布局。代码中唯一缺少的是,您正在尝试在MyView中执行findViewById(),并尝试访问活动的其他视图。此调用仅在MyView中包含的视图上有效,而不在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");
}

您可以从活动的布局xml轻松访问任何视图/布局。代码中唯一缺少的是,您正在尝试在MyView中执行findViewById(),并尝试访问活动的其他视图。此调用仅在MyView中包含的视图上有效,而不在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");
}

谢谢。我在这个论坛和其他论坛搜索了一整天后得到了这个答案。现在可以用了!!谢谢。我在这个论坛和其他论坛搜索了一整天后得到了这个答案。现在可以用了!!