2014-10-27 138 views
3

我創建了一個擴展LinearLayout的自定義視圖Game4。當我試圖找到他們時,現場並返回null(然後NullPointerException異常,然後崩潰/ !!) 這是activity_play_game.xml:findViewById返回null - 爲什麼?

<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); 
} 

的克ame_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> 

+7

logcat的????????? – nobalG 2014-10-27 10:38:21

+1

Game_4 tempGame =(Game_4)findViewById(R.id.game4); – 2014-10-27 10:41:27

+0

我已經調試過它,並且它返回null,並且在OnCreate函數之前聲明tempGame .. – mordicool 2014-10-27 11:12:35

回答

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

您需要將attrs傳遞給super構造,例如

super(context, attrs); 

否則,諸如android:id之類的超類消耗的屬性將丟失。

您可以在此兩個參數的構造做您的自定義初始化,並從1參數的構造函數調用它還有:

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); 
} 
+0

謝謝!很有幫助。 – mordicool 2014-10-27 12:24:13

-1

Game_4沒有正確導入。在佈局中,按下CTRL並將光標移至com.example.sortthegraph.Game_4並單擊以轉到相應的類。如果它沒有指向相應的班級,那麼可能會有一些問題。