[英]findViewById() returns null from a custom view
我是Android編程的新手。 我有一個Main Activity,它實現了一些TextView
和custom-view
的布局。 布局是這樣的:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/turnTextView"
//and other tags
/>
<com.example.crosstheboxprova.GameMap
android:id="@+id/gameMapView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/turnTextView" />
</android.support.constraint.ConstraintLayout>
custom-view
是這樣的:
public class GameMap extends View {
private TextView tv;
public GameMap(Context context) {
super(context);
init(context);
}
public GameMap(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public GameMap(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public GameMap(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
private void init(Context context){
//do I have to use the context in some way?
//here or on other part of the class I need something like:
tv = findViewById(R.id.turnTextView); //returns null
tv.setText("hello");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/***/
}
@Override
public boolean onTouchEvent(MotionEvent event) {
}
}
MainActivity是這樣的:
public class MainActivity extends AppCompatActivity {
private GameMap gameMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
gameMap = new GameMap(this);
}
}
問題是,當我調用FindViewById()
訪問TextView
並從custom-view
內部設置文本時,它返回null並拋出NullPonterException
。 如何從custom-view
內部訪問TextView
?
首先,您必須創建一個custom_layout.xml
並將您的TextView
以及您要使用的任何小部件放置如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
然后在custom_layout
的init()
方法中init()
custom_layout:
public class GameMap extends LinearLayout {
.
.
.
private void init(Context context) {
View rootView = inflate(context, R.layout.sampel, this);
tv = rootView.findViewById(R.id.txt);
tv.setText("hello");
}
然后添加您的custom_layout
在MainActivity layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.example.crosstheboxprova.GameMap
android:id="@+id/gameMapView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
</android.support.constraint.ConstraintLayout>
並在您的MainActivity類中:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
GameMap gameMap = (GameMap) findViewById(R.id.gameMapView);
// And continue the code ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.