我对Android编程比较陌生。我在这个主题上经历了很多线索,但提到的解决方案都没有为我工作。这是我正在尝试的。
我正在尝试使用XML文件创建布局资源,在我的MainActivity中,我执行setContentView(R.layout.activity_main)。然后我有一个扩展View的自定义视图类,我尝试修改activity_main.xml文件中定义的默认布局。
但是,任何时候我尝试在单独的文件中实现的自定义视图中使用findViewById(R.id。)(来自布局文件activity_main.xml)获取View Id,我总是得到null。如果我尝试使用findViewById(...)获取MainActivity类中的id,我会得到一个合适的值。
我在这做错了什么?
以下是所有代码段
感谢
这是文件“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>
MyView.java中的findViewById(...)调用始终返回null,而如果我将其包含在MainActivity.java文件中,则会获得正确的非空值。
有人可以指出这里有什么问题吗?
感谢
答案 0 :(得分:3)
您可以从活动的布局xml轻松访问任何视图/布局。您在代码中唯一缺少的是您尝试在MyView中执行findViewById()并尝试访问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");
}