2015-07-22 100 views
0

我在android中創建了簡單的應用程序。我在導航抽屜中有一個用戶配置文件。在該抽屜中選擇地址選項時打開該片段(例如:地址片段)。在那個佈局我把保存按鈕。點擊那個保存按鈕,我想驗證所有的字段。但是,當我從抽屜中選擇該選項時,應用程序不幸停止。片段中的Onclick按鈕方法

我的代碼在這裏:

AddressFragment.java

import android.support.v4.app.Fragment; 
 
import android.os.Bundle; 
 
import android.support.v4.app.FragmentActivity; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ArrayAdapter; 
 
import android.widget.AutoCompleteTextView; 
 
import android.widget.Button; 
 
import android.widget.EditText; 
 
import android.widget.Toast; 
 

 

 
public class AddressFragment extends Fragment { 
 
    EditText line2; 
 
    Button addrsave; 
 
\t @Override 
 
\t public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
\t \t \t \t \t \t \t Bundle savedInstanceState) { 
 

 
\t \t View view = inflater.inflate(R.layout.fragment_layout_address, container, false); 
 

 
     addrsave = (Button) getActivity().findViewById(R.id.addrsave); 
 

 
     // Get a reference to the AutoCompleteTextView in the layout 
 
\t \t AutoCompleteTextView textView = (AutoCompleteTextView) view.findViewById(R.id.city_autoCompleteTextView); 
 
\t \t // Get the string array 
 
\t \t String[] city = getResources().getStringArray(R.array.city); 
 
\t \t // Create the adapter and set it to the AutoCompleteTextView 
 
\t \t ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, city); 
 

 
\t \t textView.setAdapter(adapter); 
 
     addrsave.setOnClickListener(new View.OnClickListener() { 
 
      @Override 
 
      public void onClick(View v) { 
 
       String addr = line2.getText().toString(); 
 
       if (addr.equals("")) { 
 
        Toast.makeText(getActivity().getApplicationContext(), "Field cannot be left blank.", Toast.LENGTH_SHORT).show(); 
 
       } 
 
      } 
 
     }); 
 

 
\t return view; 
 

 
    } 
 

 

 
}

我的logcat:

07-22 12:47:46.235 6355-6355/com.h2o E/AndroidRuntime﹕ FATAL EXCEPTION: main 
 
    Process: com.h2o, PID: 6355 
 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.h2o/com.h2o.AccountActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
 
      at android.os.Looper.loop(Looper.java:135) 
 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
 
      at java.lang.reflect.Method.invoke(Native Method) 
 
      at java.lang.reflect.Method.invoke(Method.java:372) 
 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
 
      at com.h2o.AddressFragment.onCreateView(AddressFragment.java:38) 
 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
 
      at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551) 
 
      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220) 
 
      at android.app.Activity.performStart(Activity.java:5953) 
 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261) 
 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
 
            at android.os.Looper.loop(Looper.java:135) 
 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
 
            at java.lang.reflect.Method.invoke(Native Method) 
 
            at java.lang.reflect.Method.invoke(Method.java:372) 
 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

請大家幫忙!!

在此先感謝!

+0

按鈕所處的2號線視圖初始化添加到片段中XML – Destro

+0

還初始化'line2',一旦解決第一個問題,將會拋出NPE的異常 –

回答

4

改變這一行

addrsave = (Button) getActivity().findViewById(R.id.addrsave); 

addrsave = (Button) view.findViewById(R.id.addrsave); 

R.layout.fragment_layout_address被分配到view,所以你必須使用view變量從佈局獲得的按鈕。其次,還初始化line2這將拋出NPE(空指針)的一個例外,一旦你解決了第一個問題

4

更改此:

addrsave = (Button) getActivity().findViewById(R.id.addrsave); 

這樣:

addrsave = (Button) view.findViewById(R.id.addrsave); 

問題是你在getActivity()上做了findViewById(),它給你一個null。然後設置一個onClickListener就會拋出NullPointerException。

希望它有幫助! :)

2

我不能看到你已經初始化的地方line2? 所以line2爲null這可能會導致異常

String addr = line2.getText().toString(); 
0

我想你已經在片段添加按鈕,你正試圖從活動retrive它。因此,改變檢索從getActivity()視圖來查看像下面

addrsave = (Button) getActivity().findViewById(R.id.addrsave); 

替換上面下面一行

addrsave = (Button) view.findViewById(R.id.addrsave); 

和你錯過了行號38

相關問題