Android 微调器:在微调器上使用 setVisibility 时应用程序无法编译
Android Spinner: Application cannot compile when using setVisibility on spinner
我在尝试将 Visibility 设置为微调器时遇到了问题。基本上有两个微调器。第一个微调器有“是”和“否”两个选项。当程序启动时,默认选项为是,第二个微调器应该是不可见的。当用户在第一个微调器上选择否时,第二个微调器将变为可见。当我注释掉程序在模拟器上编译的可见性代码时。
我不知道为什么当我尝试使微调器可见或不可见时应用程序总是崩溃。任何帮助将非常感激。提前感谢您的时间和精力。
这是我的main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" 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=".MainActivity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView android:text="@string/CO" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/co" />
<Spinner
android:id="@+id/attendance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/Attendance"
android:prompt="@string/present" />
<Spinner
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/Status"
android:prompt="@string/status" />
</LinearLayout>
这是strings.xml
<resources>
<string name="app_name">Parade State Gen</string>
<string name="CO">CO</string>
<string name="present">Present?</string>
<string name="status">Status</string>
<string name="action_settings">Settings</string>
<string-array name="Attendance">
<item>Yes</item>
<item>No</item>
</string-array>
<string-array name="Status">
<item>LL</item>
<item>OL</item>
<item>PCL</item>
<item>CCL</item>
<item>O/S</item>
<item>CNB</item>
<item>TNB</item>
<item>MC</item>
<item>RSO</item>
<item>RS</item>
<item>OC</item>
<item>AS</item>
<item>AO</item>
</string-array>
这是主要的class
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class MainActivity extends ActionBarActivity {
Spinner attendance, status;
private Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addItemsOnAttendance();
//addListenerOnButton();
}
public void addItemsOnAttendance() {
attendance = (Spinner) findViewById(R.id.attendance);
final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.Attendance, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
attendance.setAdapter(adapter);
attendance.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
String myData = attendance.getSelectedItem().toString();
int pos = adapter.getPosition(myData);
if (pos == 1) {
status.setVisibility(View.INVISIBLE);
//Toast.makeText(getBaseContext(), myData + " already in Spinner", Toast.LENGTH_LONG).show();
// addListenerOnSpinnerItemSelection();
} else {
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
}
public void addListenerOnSpinnerItemSelection () {
status = (Spinner) findViewById(R.id.status);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.Status, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
status.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
您在调用 setVisiblity
后初始化微调器变量,这就是您收到 NullPointerException 的原因。应该是这样的:
addListenerOnSpinnerItemSelection();
status.setVisibility(View.INVISIBLE);
顺便说一句,阅读一些关于 logcat 的内容 - 没有它就不可能完成 android 应用程序。
我在尝试将 Visibility 设置为微调器时遇到了问题。基本上有两个微调器。第一个微调器有“是”和“否”两个选项。当程序启动时,默认选项为是,第二个微调器应该是不可见的。当用户在第一个微调器上选择否时,第二个微调器将变为可见。当我注释掉程序在模拟器上编译的可见性代码时。
我不知道为什么当我尝试使微调器可见或不可见时应用程序总是崩溃。任何帮助将非常感激。提前感谢您的时间和精力。
这是我的main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" 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=".MainActivity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView android:text="@string/CO" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/co" />
<Spinner
android:id="@+id/attendance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/Attendance"
android:prompt="@string/present" />
<Spinner
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/Status"
android:prompt="@string/status" />
</LinearLayout>
这是strings.xml
<resources>
<string name="app_name">Parade State Gen</string>
<string name="CO">CO</string>
<string name="present">Present?</string>
<string name="status">Status</string>
<string name="action_settings">Settings</string>
<string-array name="Attendance">
<item>Yes</item>
<item>No</item>
</string-array>
<string-array name="Status">
<item>LL</item>
<item>OL</item>
<item>PCL</item>
<item>CCL</item>
<item>O/S</item>
<item>CNB</item>
<item>TNB</item>
<item>MC</item>
<item>RSO</item>
<item>RS</item>
<item>OC</item>
<item>AS</item>
<item>AO</item>
</string-array>
这是主要的class
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
public class MainActivity extends ActionBarActivity {
Spinner attendance, status;
private Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addItemsOnAttendance();
//addListenerOnButton();
}
public void addItemsOnAttendance() {
attendance = (Spinner) findViewById(R.id.attendance);
final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.Attendance, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
attendance.setAdapter(adapter);
attendance.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
String myData = attendance.getSelectedItem().toString();
int pos = adapter.getPosition(myData);
if (pos == 1) {
status.setVisibility(View.INVISIBLE);
//Toast.makeText(getBaseContext(), myData + " already in Spinner", Toast.LENGTH_LONG).show();
// addListenerOnSpinnerItemSelection();
} else {
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
}
public void addListenerOnSpinnerItemSelection () {
status = (Spinner) findViewById(R.id.status);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.Status, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
status.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
您在调用 setVisiblity
后初始化微调器变量,这就是您收到 NullPointerException 的原因。应该是这样的:
addListenerOnSpinnerItemSelection();
status.setVisibility(View.INVISIBLE);
顺便说一句,阅读一些关于 logcat 的内容 - 没有它就不可能完成 android 应用程序。