2014-09-23 109 views
0

我覺得我錯過了OOP中的一個重要點,或者我的構造函數是錯誤的。創建我的對象時,我不斷收到空指針異常。當訪問構造函數時出現NullPointerException

logcat說它來自'//默認構造函數'的第一行。

這裏是我的類代碼:

package com.chriswahlfeldt.homeworkapp; 

     import android.app.Activity; 
     import android.view.View; 
     import android.widget.EditText; 

public class MyHomework extends Activity { 

    private EditText title, description; 
    private View homeworkView, activityView; 

    // default constructor 
    public MyHomework() { 

     homeworkView = getLayoutInflater().inflate(R.layout.add_homework, null); 
     activityView = getLayoutInflater().inflate(R.layout.activity_my, null); 

     title = (EditText) homeworkView.findViewById(R.id.classTitleET); 
     title.setText(""); 

     description = (EditText) homeworkView.findViewById(R.id.descriptionET); 
     title.setText(""); 

    } 

    public View getContentView_activity_my() { return activityView; } 

    public View getContentView_add_homework() { return homeworkView; } 

    public String getTitleTxt() { return title.getText().toString(); } 

    public String getDescriptionTxt() { return description.getText().toString(); } 

    public void setTitleTxt(String thatString) { title.setText(thatString); } 

    public void setDescriptionTxt(String thatString) { title.setText(thatString); } 
} 

這裏是它被使用:

package com.chriswahlfeldt.homeworkapp; 

     import android.app.Activity; 
     import android.os.Bundle; 
     import android.view.View; 
     import android.widget.Button; 

public class MyActivity extends Activity 
{ 

    private MyHomework hW = new MyHomework(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(hW.getContentView_activity_my()); 

     final Button addHWBtn = (Button) findViewById(R.id.HWBtn); 

     addHWBtn.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         setContentView(hW.getContentView_add_homework()); 
        } 
       }); 
    } 
} 

.xml文件:activity_my.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MyActivity" 
android:id="@+id/mainRelLayout" > 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/HWBtn" 
     android:textSize="25sp" 
     android:paddingLeft="50dp" 
     android:paddingRight="50dp" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:hint="+Homework"/> 

</RelativeLayout> 

.XML file:add_homework.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:alpha=".8"> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="textPersonName" 
     android:ems="10" 
     android:id="@+id/classTitleET" 
     android:layout_gravity="top" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:capitalize="sentences" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10dp" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginRight="10dp" 
     android:hint="Class Title" 
     android:textSize="20sp" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="textMultiLine" 
     android:ems="8" 
     android:id="@+id/descriptionET" 
     android:layout_below="@+id/classTitleET" 
     android:layout_alignLeft="@+id/classTitleET" 
     android:layout_alignStart="@+id/classTitleET" 
     android:layout_alignRight="@+id/classTitleET" 
     android:layout_alignEnd="@+id/classTitleET" 
     android:hint="Homework Description" 
     android:textSize="20sp" 
     android:height="120dp" 
     android:gravity="top" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/createBtn" 
     android:hint="Create" 
     android:textSize="20sp" 
     android:layout_below="@+id/descriptionET" 
     android:layout_alignLeft="@+id/descriptionET" 
     android:layout_alignStart="@+id/descriptionET" 
     android:layout_alignRight="@+id/descriptionET" 
     android:layout_alignEnd="@+id/descriptionET" /> 

</RelativeLayout> 

Thx!

+1

這將是一個很好[參考](http://stackoverflow.com/問題/ 3302177/android-activity-constructor-vs-oncreate) – 2014-09-23 03:10:50

+0

此外,[不要將null傳遞給'inflate()'!](http://www.doubleencore.com/2013/05/layout-inflation- as-intended /) – kcoppock 2014-09-23 04:58:08

回答

2

你不能直接調用getLayoutInflater(),你需要在LayoutInflater類的一個實例上調用它。 試試這個

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
homeworkView = inflater.inflate(R.layout.add_homework, null); 

你可以替換上下文「這個」如果要調用這個INAN活動

+0

這很有效,但在創建時創建對象時,我必須將Context傳遞給我的構造函數。 Thx推動我朝着正確的方向發展! – cwahlfeldt 2014-09-23 03:48:44

+0

@waffles在繼續閱讀之前閱讀[活動參考資料](http://developer.android.com/guide/components/activities.html)的內容可能會更好 - 當您使用主構造函數時,Android不喜歡它並傾向於使用onCreate()等 – panini 2014-09-23 03:51:12

2

這是一個不好的做法,把代碼活動的構造函數中。你可以放入OnCreate方法。

如果你真的需要這個實例。

你可以做以下

public class MyHomework extends Activity { 

    private EditText title, description; 
    private View homeworkView, activityView; 
    private static MyHomework instance; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     instance = this; 
    } 
    public static MyHomework getActivity() { 
     return instance; 
    } 
} 

 

public class MyActivity extends Activity 
{ 

    private MyHomework hW = MyHomework.getActivity(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ..... 
    } 
} 
0
  1. 不能調用活性的方法或在活動週期使用活動作爲ContextonCreate()之前。包含構造函數的實例初始化爲時尚早。因此,您很少需要爲活動使用顯式構造函數。

  2. 永遠不要用new實例化活動類。與上面相關:這些對象對於任何事情都不是很好,因爲它們沒有被正確初始化爲活動,並且它們的活動生命週期方法(如onCreate())未被調用。

它看起來像你的MyHomework不應該在所有的活動:

  • 刪除`延伸Activity``

  • 傳遞一個Context作爲參數傳遞給需要的方法它。例如,

    public MyHomework(Context context) { 
        homeworkView = LayoutInflater.from(context).inflate(...) 
    

    調用從MyActivityonCreate()(未成員變量INIT,太早):

    homework = new MyHomework(this) 
    
相關問題