findViewById возвращает null-почему?



Я создал пользовательский вид Game4, который расширяет LinearLayout. Когда я попытался найти их, это поле и вернуло null (а затем nullPointerException, а затем crash/!!)
Это activity_play_game.xml:



<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.sortthegraph.PlayGameActivity"
tools:ignore="MergeRootFrame" >

<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<com.example.sortthegraph.Game_4 // A custom View extends LinearLayout
android:id="@+id/game4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" >
</com.example.sortthegraph.Game_4>

<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#000000" />

<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>




Это моя функция OnCreate:



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_game);
tempGame = (Game_4) findViewById(R.id.game4); // ?? Why null ??


Это конструкторы Game_4:



public class Game_4 extends LinearLayout {
public Game_4(Context context, AttributeSet attrs) {
this(context);
}
public Game_4(Context context) {
super(context);

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.game_4_layout, this, true);
this.setWillNotDraw(false);
}


Game_4_layout.xml:



<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="20dp"
android:paddingBottom="25dp"
android:layout_marginLeft="15dip"
android:layout_marginRight="15dip"
android:gravity="center" >

<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<View android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />

<com.example.sortthegraph.BackButton
android:id="@+id/backButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp" >
</com.example.sortthegraph.BackButton>

<View android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />

</TableRow>

<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="20dip"
android:layout_marginTop="20dip" >

<com.example.sortthegraph.BackButton
android:id="@+id/backButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</com.example.sortthegraph.BackButton>

<View
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />

<com.example.sortthegraph.BackButton
android:id="@+id/backButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</com.example.sortthegraph.BackButton>

</TableRow>

<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<View android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />

<com.example.sortthegraph.BackButton
android:id="@+id/backButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" >
</com.example.sortthegraph.BackButton>

<View android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />

</TableRow>


550   2  

2 ответов:

public Game_4(Context context, AttributeSet attrs) {
    this(context);
}

Вам нужно передать attrs конструктору super, например

super(context, attrs);
В противном случае атрибуты, потребляемые суперклассом, такие как android:id, теряются.

Вы можете сделать свой пользовательский init в этом конструкторе two-arg и вызвать его из конструктора 1-arg:

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

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.game_4_layout, this, true);
    this.setWillNotDraw(false);
}

public Game_4(Context context) {
    this(context, null);
}

Game_4 не был импортирован должным образом. Также в layout нажмите CTRL и переместите курсор на com.образец.сорттеграф.Game_4 и нажмите, чтобы перейти к соответствующему классу. Если он не направлен к этому соответствующему классу, то может возникнуть некоторая проблема.

Comments

    Ничего не найдено.