我想到了一些不太优雅的方法来解决这个问题,但我知道我必须遗漏一些东西.
我onItemSelected立即开火,没有与用户进行任何交互,这是不受欢迎的行为.我希望UI等到用户选择之前做任何事情.
我甚至尝试过设置听众onResume(),希望这会有所帮助,但事实并非如此.
如何在用户触摸控件之前停止此操作?
public class CMSHome extends Activity {
private Spinner spinner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Heres my spinner ///////////////////////////////////////////
spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.pm_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
};
public void onResume() {
super.onResume();
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
Intent i = new Intent(CMSHome.this, ListProjects.class);
i.putExtra("bEmpID", parent.getItemAtPosition(pos).toString());
startActivity(i);
Toast.makeText(parent.getContext(), "The …Run Code Online (Sandbox Code Playgroud) 只是想知道如何处理以下问题:根据两个微调器的选定项目计算结果.为了处理UI事物,即用户在其中一个微调器中选择一个新项目,我setOnItemSelectedListener在我onCreate()的活动方法中为旋转器安装了一个监听器.
现在:当然,这很好.听众的工作是触发结果的新计算.
问题:因为我拦截onPause() onResume()了保存/恢复最后一个状态,我得到了一个方法,可以像这里一样以编程方式设置这两个微调器的选定项:
startSpinner.setSelection(pStart);
destSpinner.setSelection(pDest);
Run Code Online (Sandbox Code Playgroud)
这两个调用也会调用侦听器!我的结果的计算方法加上新结果集的通知在这里被调用两次!
一个愚蠢的直接方法就是让一个布尔变量禁用侦听器在里面做的任何事情,在设置所选项目之前设置它并在之后重置它.好的.但是有更好的方法吗?
我不希望通过代码操作来调用侦听器,只能通过用户操作来调用!:-(
你怎么做呢?谢谢!
我的Android应用程序中有一个微调器,并且onItemSelected()在进入活动时会自动触发其事件.
我该如何避免这种情况?
我有运行OnItemSelectedListenerspinner事件的代码.所以,当我在方法中时:
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// I want to do something here if it's a user who changed the the selected item
}
Run Code Online (Sandbox Code Playgroud)
...我如何知道项目选择是通过编程方式完成还是通过用户操作通过UI完成?
我有以下代码:
public class OnboardingActivity extends BaseLoggedInActivity
implements CountryPickerDialog.ICountryPickerDialogUsers, AdapterView.OnItemSelectedListener {
private Spinner _countryCodeSpinner;
.
.
.
private void setupCountrySpinner() {
List<String> sortedCountryCodeList = CountryData.getInstance().getSortedCountryCodes();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
R.layout.country_code_spinner_item,
sortedCountryCodeList);
_countryCodeSpinner.setOnItemSelectedListener(this);
_countryCodeSpinner.setAdapter(adapter);
_countryCodeSpinner
.setOnTouchListener(getCountryCodeSpinnerTouchListener(_countryCodeSpinner));
int position = getDefaultCountryNamePosition();
if (position >= 0) {
_countryCodeSpinner.setSelection(position);
}
}
.
.
.
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_logger.debug("Inside onItemSelected");
view.setSelected(true);
}
Run Code Online (Sandbox Code Playgroud)
我在上面的函数onItemSelected 中得到一个空指针异常。它返回 NULL 视图。我从一位用户那里收到了这条痕迹,但我自己无法重现。使用 NULL 视图调用 onItemSelected 的原因可能是什么?
谢谢
我正在使用'Fragment'来获得一个带有两个'片段'的布局,所以我的课程扩展了'Fragment'.
我在左侧'片段'上加载'ListView',在右侧'片段'上加载了另一个修改过的'ListView'.在这里,我有一个'Spinner',我必须改变它的颜色.
我有这个代码:
private void loadSpinner(int value) {
//Not relevant code
adapter = new ArrayAdapter<CharSequence>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_item, data);
adapter.setDropDownViewResource(R.layout.spinner);
spinner.setAdapter(adapter);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String value = parent.getItemAtPosition(position).toString();
((TextView) parent.getChildAt(0)).setTextColor(getResources().getColor(R.color.black));
//Some code
}
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作UNTIL我旋转设备的屏幕.在这里,我得到一个nullpointerexception在((TextView) parent.getChildAt(0)).setTextColor(getResources().getColor(R.color.black));.
如果我评论上面这一行,因为我在旋转屏幕之前保存状态,在旋转屏幕后,我的数据将被恢复并且所有工作都按预期工作除了浅色的微调器因此不可见.
我知道我可以创建自己的'微调'布局并解决这个问题,但我想知道如何解决这个问题.