Java 将微调器和Button onClick Listener组合在一起会给我一个空指针异常
我有一个应用程序,允许一个人发布公告。此人必须在微调器上选择其公告的类别,并在Java 将微调器和Button onClick Listener组合在一起会给我一个空指针异常,java,android,android-studio,nullpointerexception,android-spinner,Java,Android,Android Studio,Nullpointerexception,Android Spinner,我有一个应用程序,允许一个人发布公告。此人必须在微调器上选择其公告的类别,并在编辑文本上键入其公告。输入这两个字段后,按钮将允许人员进行公告,但如果微调器值或EditText值为空,则应生成错误。我尝试使按钮对键入公告的人不可见,因为我遇到了空指针异常,但切换到后,使按钮不可见,我仍然会遇到相同的错误。这是我的代码: public class MakeAnnouncements extends AppCompatActivity { private EditText announcement;
编辑文本上键入其公告。输入这两个字段后,按钮将允许人员进行公告,但如果微调器值或EditText
值为空,则应生成错误。我尝试使按钮对键入公告的人不可见,因为我遇到了空指针异常
,但切换到后,使按钮不可见,我仍然会遇到相同的错误。这是我的代码:
public class MakeAnnouncements extends AppCompatActivity {
private EditText announcement;
private Button announce_button;
private ProgressDialog announcementDialog;
private DatabaseReference mRootRef;
private FirebaseAuth mAuth;
private String mCurrentUserId;
private String announcer;
private String []SPINNERCATEGORY ={"General","Cubs","Scouts","Seniors"};
private String category_text;
private MaterialBetterSpinner betterSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_make_announcements);
announcementDialog = new ProgressDialog(this);
mRootRef = FirebaseDatabase.getInstance().getReference();
mAuth = FirebaseAuth.getInstance();
mCurrentUserId = mAuth.getCurrentUser().getUid();
announcement = (EditText)findViewById(R.id.announce_text);
announce_button = (Button)findViewById(R.id.announce_btn);
announce_button.setVisibility(View.VISIBLE);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,SPINNERCATEGORY);
betterSpinner = (MaterialBetterSpinner)findViewById(R.id.category_spinner);
betterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
String spinner_value= adapterView.getItemAtPosition(position).toString();
if(position==0){
// no item selected show Toast message
announce_button.setVisibility(View.INVISIBLE);
} else{
announce_button.setVisibility(View.VISIBLE);
// item selected
}
category_text = spinner_value;
return;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
announce_button.setVisibility(View.INVISIBLE);
}
});
betterSpinner.setAdapter(arrayAdapter);
mRootRef.child("Users").child(mCurrentUserId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
announcer = dataSnapshot.child("name").getValue().toString();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
announce_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { //<----- This is where i am getting a null point exception
String announced_text = announcement.getText().toString().trim();
String choosen_category = category_text.trim();
if (TextUtils.isEmpty(announced_text)){
announcement.setError("You did not type any announcement");
return;
}
announcementDialog.setTitle("Posting Announcement...");
announcementDialog.setMessage("Please wait...");
announcementDialog.setCanceledOnTouchOutside(false);
announcementDialog.show();
PostAnnouncement(announced_text,choosen_category);
}
});
}
private void PostAnnouncement(String announced_text, String choosen_category) {
DatabaseReference chat_push_key = mRootRef.child("Announcements").child(announcer).push();
String push_key = chat_push_key.getKey();
Map messageMap = new HashMap();
messageMap.put("announcement",announced_text);
messageMap.put("type","text");
messageMap.put("category",choosen_category);
messageMap.put("from",announcer);
messageMap.put("time", ServerValue.TIMESTAMP);
Map messageUserMap = new HashMap();
messageUserMap.put( "Announcements" + "/" + push_key, messageMap);
announcement.setText("");
announcementDialog.hide();
Toast.makeText(getApplicationContext(), "Your announcement was successfully posted",Toast.LENGTH_LONG).show();
mRootRef.updateChildren(messageUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if(databaseError != null){
Log.d("CHAT_LOG", databaseError.getMessage().toString());
}
}
});
}
}
公共类MakeAnnounces扩展了AppCompative活动{
私人编辑文本公告;
私人按钮宣布按钮;
私有进程对话框公告对话框;
私有数据库参考mRootRef;
私人消防队;
私有字符串mCurrentUserId;
私人弦乐播音员;
私人字符串[]喷丝头类别={“将军”、“小熊”、“童子军”、“长者”};
私有字符串类别\文本;
私人材料纺织厂;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u发布公告);
announcementDialog=newprogressdialog(此);
mRootRef=FirebaseDatabase.getInstance().getReference();
mAuth=FirebaseAuth.getInstance();
mCurrentUserId=mAuth.getCurrentUser().getUid();
公告=(EditText)findViewById(R.id.announcer\u text);
宣布按钮=(按钮)findViewById(R.id.announce\u btn);
宣布按钮。设置可见性(视图。可见);
ArrayAdapter ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u下拉列表\u item\u 1line,SPINNERCATEGORY);
betterSpinner=(MaterialBetterSpinner)findViewById(R.id.category_spinner);
betterSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共位置(适配器视图适配器视图视图视图视图内部位置长l){
字符串微调器_value=adapterView.getItemAtPosition(位置).toString();
如果(位置==0){
//未选择任何项目显示Toast消息
宣布按钮。设置可见性(视图。不可见);
}否则{
宣布按钮。设置可见性(视图。可见);
//选定项目
}
类别\文本=微调器\值;
返回;
}
@凌驾
未选择公共无效(AdapterView AdapterView){
宣布按钮。设置可见性(视图。不可见);
}
});
设置适配器(阵列适配器);
mRootRef.child(“用户”).child(mCurrentUserId).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
announcer=dataSnapshot.child(“name”).getValue().toString();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
宣布按钮。setOnClickListener(新视图。OnClickListener(){
@凌驾
public void onClick(View View){/根据您的代码,您可以检查变量category\u text
if(TextUtils.isEmpty(category_text)){
//Show your error message
}
在检查了可能的解决方法后,我得到了帮助。
我首先将微调器_值更改为全局变量。然后编写以下代码:
String announced_text = announcement.getText().toString().trim();
String choosen_category = null;
if (TextUtils.isEmpty(announced_text)){
announcement.setError("You did not type any announcement");
return;
}
if(spinner_value != null){
choosen_category = spinner_value.trim();
return;
}
else if(spinner_value == null){
betterspinner.setError("This section must be selected before proceeding");
return;
}
之后,我删除了初始代码中的按钮可视性。使用spinner,默认值始终选择第一个值,但第一个值为null,如果未输入任何内容,我将获得NullPointerException@BrijeshJoshi你能看看我的解决方案吗?但在选择一个微调器值后,当n当选择某个值时,选择其他值