2017-05-27 47 views
0

我正在构建一个在FAB单击时显示警告对话框的应用程序,接受用户输入并使用该用户输入命名ExpandableListView组标题。当我点击FAB按钮并放入文本时,它会给我一个空对象引用。为什么我会在空对象引用上获取EditText.getText()'?

我初始化我的学期前onCreate()

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    ExpandableListView expandableListView; 
    ExpandableListViewAdapter adapter; 
    private FloatingActionButton addItems; 
    private String semester = ""; 

在我addItems()方法,它是当有FAB点击调用,我创建我的自定义警告对话框,让用户输入字符串和配售它在我的ArrayList中的适配器。

public void addItems() { 
     final EditText et_semester = (EditText)findViewById(R.id.et_semester); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Create A Semester"); 
     builder.setView(R.layout.custom_layout); 
     builder.setCancelable(false); 
     builder.setPositiveButton("DONE", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       semester = et_semester.getText().toString(); 
       adapter.groupNames.add(semester); 
      } 
     }); 

     builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     adapter.notifyDataSetChanged(); 
     builder.show(); 
    } 

但是,当我点击AlertDialog完成按钮,这是我的堆栈跟踪:

05-30 05:35:10.295 20943-20943/myapp.onur.expandablelistviewexample E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: myapp.onur.expandablelistviewexample, PID: 20943 
                         java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference 
                          at myapp.onur.expandablelistviewexample.MainActivity$1.onClick(MainActivity.java:45) 

编辑这是我MainActivity

public class MainActivity extends AppCompatActivity { 

    ExpandableListView expandableListView; 
    ExpandableListViewAdapter adapter; 
    private FloatingActionButton addItems; 
    private String semester; 

    int counter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     expandableListView = (ExpandableListView) findViewById(R.id.expListView); 

     adapter = new ExpandableListViewAdapter(MainActivity.this); 
     expandableListView.setAdapter(adapter); 
     addItems = (FloatingActionButton) findViewById(R.id.add_items); 

     final EditText et_semester = (EditText)findViewById(R.id.et_semester); 
    } 

    public void addSemester(View v){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setTitle("Create A Semester"); 
     builder.setView(R.layout.custom_layout); 
     builder.setCancelable(false); 

     builder.setPositiveButton("DONE", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       final EditText et_semester = (EditText).findViewById(R.id.et_semester); 
       semester = etSemester.getText().toString(); 
       adapter.groupNames.add(semester); 
      } 
     }); 

     builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     adapter.notifyDataSetChanged(); 
     builder.show(); 
    } 

} 
+0

请发表您的onCreate方法 – lelloman

+0

move'final EditText et_semester =(EditText)findViewById(R.id.et_semester);'OnCreate'方法 –

+0

@lelloman它在那里。 –

回答

0

你的EditText R.id .et_semester不在您的活动内容视图中,因此您必须在对话视图中找到此视图

// Inflate your view 
    View dialogView = LayoutInflater.from(context).inflate(R.layout.custom_layout, null); 
    // Bind views 
    final EditText et_semester = (EditText) dialogView.findViewById(R.id.et_semester); 
    // Create dialog 
    AlertDialog.Builder builder = new AlertDialog.Builder(context) 
      .setTitle("Create A Semester") 
      .setView(dialogView) 
      .setCancelable(false); 
+0

我在我的'addItems()'方法中初始化dialogView吗? –

+0

@OnurOzbek是的,应该工作 –

0

汉克穆迪的回答是正确的。这就是我所做的。

public void addSemester(View v){ 

     View dialogView = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_layout, null); 
     final EditText et_semester = (EditText)dialogView.findViewById(R.id.et_semester); 

     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setTitle("Create A Semester"); 
     builder.setView(dialogView); 
     builder.setCancelable(false); 

     builder.setPositiveButton("DONE", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       semester = et_semester.getText().toString(); 
       adapter.groupNames.add(semester); 
      } 
     }); 

     builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 
     adapter.notifyDataSetChanged(); 
     builder.show(); 
    } 

调用方法addSemester()onCreate()是不是一个好主意,因为在该方法中的某些设置,通过FAB点击触发的,但如果你将其放置在onCreate()方法,它们运行的​​瞬间活动创建。

相关问题