- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
伙计们,我需要你们的眼睛。我已经为我的代码奋斗了很长时间,但我仍然像一个旧架子一样卡住了。
你看,有很多主题与 android 警告相关:
W/InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub...
我读了很多,没有找到任何有用的东西,我的眼睛很累。
我正在开发一个微调器组件,第一个项目名为 Add new... 会触发一个对话框以将另一个项目添加到列表中。因为我目前有两个这样的微调器(在一个 Activity 中),所以我为微调器创建了一个包装类,它负责处理逻辑,并且我创建了类,它扩展了 DialogFragment
。因为两个微调器都会用 <EditText>
触发类似的对话框, 只是不同的标题。
但在 View 中,只有第一个微调器起作用。第二个旋转器,当choosig选项添加新的... 时,什么也不做,只会产生上面写的警告。
是 KegAddActivity extends AppCompatActivity
的内部类看起来像这样:
public class ExtendableSpinner implements AdapterView.OnItemSelectedListener, View.OnTouchListener {
private static final int ADD_NEW_ID = -1;
private final Spinner _mSpinner;
private final String _mTableName;
private final int _mAddNewTitle;
private final MatrixCursor _mAddOptionsCursor;
private Uri _mAdapterUri;
private SimpleCursorAdapter _mAdapter;
private boolean _mWasTouched;
public ExtendableSpinner(Spinner spinner, String tableName, int addNewTitle) {
super();
_mSpinner = spinner;
_mTableName = tableName;
_mAdapterUri = BeerBookUriHandler.getUri(tableName);
_mAddNewTitle = addNewTitle;
_mAddOptionsCursor = new MatrixCursor(new String[]{Table.COL_ID, BeerTable.COL_NAME});
_mAddOptionsCursor.addRow(new String[]{"" + ADD_NEW_ID, getString(addNewTitle) + '\u2026'});
_mSpinner.setOnTouchListener(this);
_mSpinner.setOnItemSelectedListener(this);
}
public void setAdapterUri(Uri uri) {
_mAdapterUri = uri;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
_mWasTouched = true;
return false;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (_mWasTouched) {
// event fired by user
if (id == ADD_NEW_ID) {
Bundle args = new Bundle();
args.putInt(AddNewDialogFragment.TITLE, _mAddNewTitle);
_mAddNewDialogFragment = new AddNewDialogFragment();
_mAddNewDialogFragment.setArguments(args);
_mAddNewDialogFragment.show(getSupportFragmentManager(), _mTableName + "AddNewDialog");
}
} else {
// event fired at activity start
int selection = 0;
if (_mAdapter.getCount() > 1) {
selection = 1;
Uri uri = BeerBookUriHandler.getUri(KegTable.NAME + "/last");
Cursor cursor = getContentResolver().query(uri, new String[]{
_mTableName + "." + Table.COL_ID
}, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
long lastUsedId = cursor.getLong(0);
selection = getPositionForId(lastUsedId);
}
cursor.close();
}
_mSpinner.setSelection(selection);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void populate() {
Cursor cursor = getContentResolver().query(_mAdapterUri,
BEER_PROJECTION, null, null, BeerTable.COL_NAME);
Cursor extendedCursor = new MergeCursor(new Cursor[]{ _mAddOptionsCursor, cursor});
_mAdapter = new SimpleCursorAdapter(getApplicationContext(),
SPINNER_LAYOUT, extendedCursor, new String[] { BeerTable.COL_NAME },
new int[] {android.R.id.text1}, 0);
_mAdapter.setDropDownViewResource(SPINNER_ITEM_LAYOUT);
_mSpinner.setAdapter(_mAdapter);
}
public int getPositionForId(long itemId) {
int pos = 0;
for(int i = 1, l = _mAdapter.getCount(); i < l; i++)
if (itemId == _mAdapter.getItemId(i)) {
pos = i;
break;
}
return pos;
}
public long getSelectedId() {
return _mSpinner.getSelectedItemId();
}
public void setSelectionById(long id) {
_mSpinner.setSelection(getPositionForId(id));
}
}
在onCreate()
方法我像这样实例化微调器
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
final Spinner beerSpinner = (Spinner) findViewById(R.id.keg_add_beer);
_mBeerSpinner = new ExtendableSpinner(beerSpinner, BeerTable.NAME, R.string.beer_add);
// initially disable, wait for brewery selection
beerSpinner.setEnabled(false);
final Spinner brewerySpinner = (Spinner) findViewById(R.id.keg_add_brewery);
_mBrewerySpinner = new ExtendableSpinner(brewerySpinner, BreweryTable.NAME, R.string.brewery_add) {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
super.onItemSelected(parent, view, position, id);
if (id > 0) {
// brewery selected, populate beerSpinner
Uri uri = BeerBookUriHandler.getUri(BreweryTable.NAME + "/" +
getSelectedId() + "/" + BeerTable.NAME);
_mBeerSpinner.setAdapterUri(uri);
_mBeerSpinner.populate();
beerSpinner.setEnabled(true);
}
}
};
_mBrewerySpinner.populate();
...
}
因为第一个微调器工作而第二个微调器不工作并且它们非常相似,我认为微调器以某种方式并发聚焦,但我真的不知道。我试过替换 DialogFragment
每个微调器都有单独的 Activity ,并且 onItemSelected
旋转器的事件然后称为 startActivityForResult()
但这导致了同样的问题,第一个微调器运行良好,第二个微调器失败并出现警告,因此问题可能出在微调器的代码中。
幸运的是,我找到了 constellation 它起作用的地方,然后能够找出它不起作用的原因。
如果 Add new... 的项目当前在微调器中被选中,则再次选择 Add new... 项目会产生 ignoring focus gain
警告。但是,如果您在微调器中选择其他一些项目,然后选择添加新...,它就会起作用。问题是,如果微调器中没有其他项目,则无法执行此类重新选择。好像是 onItemSelected
如果您选择一个已选择的选项,则不会传播事件。但这是个大问题,因为用户可以在 AddNewDialog
处点击取消返回主视图,然后 Add new... 将保持选中状态并且可能是唯一的选项,因此无法打开 AddNewDialog
再次。
如何使其工作的解决方案是添加另一个默认项,例如从列表中选择... 项,如果用户取消对话框,则将微调器重新选择为默认选项。我会测试它并保持这篇文章的更新。
如果您选择 Spinner
之前选择的项目,itemSelected
事件未传播并且W/InputMethodManagerService: Window already focused, ignoring focus gain
警告出现在您的日志中。
自 Spinner
不支持 onItemClick
事件,我发现唯一可行的解决方法是定义一个默认选项从列表中选择... 如果用户取消 AddNewDialog
onDialogNegativeClick
监听器将微调器重置为默认的 Choose from... 项目,因此在点击 Add new... 后,选择发生变化并且事件被传播。
最佳答案
我们遇到了同样的问题,并确定解决这个问题的唯一方法是创建一个调用 onItemSelected()
的自定义 Spinner,即使选择了相同的项目也是如此:
public class CustomSpinner extends Spinner {
public CustomSpinner(Context contextArg){
super(contextArg);
}
public CustomSpinner(Context contextArg, AttributeSet attributeSetArg){
super(contextArg, attributeSetArg);
}
public CustomSpinner(Context contextArg, AttributeSet attributeSetArg, int styleArg){
super(contextArg, attributeSetArg, styleArg);
}
@Override
public void setSelection(int positionArg){
boolean samePosition = positionArg == getSelectedItemPosition();
super.setSelection(positionArg, false);
// here we modifiy the Spinner's default behavior
if(samePosition){
// we dispatch the event, even if the position is the same
OnItemSelectedListener onItemSelectedListener = getOnItemSelectedListener();
if(onItemSelectedListener != null){
onItemSelectedListener.onItemSelected(this,
getSelectedView(),
positionArg,
getSelectedItemId());
}
}
}
@Override
public void setSelection(int positionArg, boolean animateArg){
boolean samePosition = positionArg == getSelectedItemPosition();
super.setSelection(positionArg, animateArg);
// here we modifiy the Spinner's default behavior
if(samePosition){
// we dispatch the event, even if the position is the same
OnItemSelectedListener onItemSelectedListener = getOnItemSelectedListener();
if(onItemSelectedListener != null){
onItemSelectedListener.onItemSelected(this,
getSelectedView(),
positionArg,
getSelectedItemId());
}
}
}
}
关于Android 警告 : Window already focused, 忽略焦点增益,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986258/
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我一直在尝试使用 Bootstrap 的表单样式处理 AngularJS 的电子邮件验证,并遇到了这个 CSS block 。 input:focus:required:invalid, textar
我在 bootstrap 中查看 dropdown.js 的历史,并在 git 上发现了以下更改历史文件,here : $this.focus() // focus() being changed
在不考虑性能的情况下,我总是认为 $(":focus") 返回的 jquery 对象等同于 $(document.activeElement)。 但是,如果您闯入浏览器调试器并评估 $(":focus
我使用 datatables from fluent kit和分页,当点击时(:active)突出显示: box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25); 我
我的目标是在单击 span(带有 Show Me 文本)时显示带有 show 类的 p 标签。我曾尝试使用 :focus 伪选择器来执行此操作,但使用此方法使得 p 标记仅在单击其他位置之前显示,其中
result 我想让图片保持点击状态。 我为每个图标使用了两个图像。一个是什么时候没有被点击。另一个是何时单击。悬停工作正常。但焦点根本不起作用。 我没有看到任何错误或错误。请帮帮我! 这是 body
我在表格布局中嵌套了编辑文本,然后在 ScrollView 中嵌套了表格布局,触摸模式下的可聚焦/可聚焦在真实设备中不起作用,但令人惊讶的是它在模拟器中起作用。 请问能否提供一些替代解决方案? 最佳答
我使用 Backbone.js 的代码的 View 部分是这样的: var myView = Backbone.View.extend({ events: { 'focus .
我有一个行为类似于选项卡控件的用户控件。选项卡标题是 UserControl 实例,它们重写 Paint 事件以使它们看起来是自定义的。 为了利用选项卡页上各种控件上的验证事件,当用户单击选项卡标题时
我遇到了一个麻烦的网页,其结构很复杂。如果用鼠标单击一个DIV,则一切正常。但是,如果它是通过 javascript 获得焦点的(即 divElement.focus)。布局变得凌乱。这只发生在 IE
这是一个代码笔来演示我所看到的: https://codepen.io/anon/pen/zMvxPy HTML: JS: $('input').on('focus', () => { cons
问题: PrimeFaces“p:focus”标签不是聚焦。 - 即,当 xhtml 页面呈现给用户时,没有输入字段处于焦点。 问题: 为什么不呢?如何让“p:focus”在这个简单的应用程序中正常工
我有一个 只有当第一个子元素获得焦点而不是第二个子元素时,我才想在其中设置焦点的元素。我尝试使用 :not伪类,但没有成功。 值得注意的是,我仍然需要关注第二个元素,只是不想有两个焦点元素(父 + 子
我正在尝试用纯 CSS 创建一个可访问的下拉菜单,但我不太确定该怎么做。 如果 anchor 处于事件状态,我可以获得下一个 UL(子菜单),但是一旦进入子菜单,聚焦第一个链接,我不确定如何告诉 an
我在 jQuery UI 代码库中看到 .focus(1),但我无法弄清楚该参数的用途。 它与.focus()有何不同?我阅读了 jQuery 网站上的 .focus 文档,但仍然一无所知。 谢谢。
在 WPF 中,有两种方法可以将焦点设置到元素上。 您可以调用 input 元素的 .Focus() 方法,也可以使用 input 元素作为参数调用 Keyboard.Focus() 。 // fir
我有一个可以获得焦点的父组件。它使用这个焦点来提供键盘控制。该父组件可以生成一个子组件,该子组件同样可以获取焦点,以便它可以响应键盘事件。子组件监听的键盘事件之一是 这会导致子组件被卸载。 当子组件卸
我有一个可以获得焦点的父组件。它使用这个焦点来提供键盘控制。该父组件可以生成一个子组件,该子组件同样可以获取焦点,以便它可以响应键盘事件。子组件监听的键盘事件之一是 这会导致子组件被卸载。 当子组件卸
我试图突出焦点 秒。 我添加了 -1 的标签索引给他们每个人,并确认调用some_tr.focus()套document.activeElement那个some_tr .然而,由于某种原因some_t
我是一名优秀的程序员,十分优秀!