【问题标题】:Strange behavior with getChildFragmentManager in Android 4.3 and lessAndroid 4.3 及更低版本中 getChildFragmentManager 的奇怪行为
【发布时间】:2014-05-12 10:38:57
【问题描述】:

getChildFragmentManager 方法有问题。

我用它在 viewpager 中创建了几个嵌套片段。此 Viewpager 位于 PopupWindow 中。 这样,片段就创建好了,我可以在 UI 中看到它们。 片段包含一个网格视图。

不幸的是,使用 android 4.3(API 18) 或更低版本,我无法选择 gridview 的项目。 同时,使用 android 4.4 (API 19) 我可以做到!

为了拦截item点击,我使用了Activity的回调,Activity的onAttach方法是正确的。

我认为问题是由getChildFragmentManager引起的,但我不确定。

如果有人遇到这个问题,他能解释一下他的解决方案吗?谢谢!

【问题讨论】:

  • 您是否尝试将 EditText 放置在 GridView 中? GridView 中有哪些类型的控件?
  • Gridview 包含 imageView!我想点击imageview开始一些动作,但是这个点击没有被拦截!

标签: android gridview android-fragments android-nested-fragment


【解决方案1】:

我解决了我的问题。

在 Adroid 4.4 中我没有遇到任何问题,所以我没有对我的代码进行任何更改。这样,我在gridview中添加了一个监听器。

gridView.setOnItemClickListener(this);

... // class extends Listener

 @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    if(DEBUG) Log.d("EmojiconGridFragment","entered");
    if (mOnEmojiconClickedListener != null) {
        if(DEBUG) Log.d("EmojiconGridFragment","itemClicked");
        mOnEmojiconClickedListener.onEmojiconClicked((Emojicon) parent.getItemAtPosition(position));
    }
}

对于 android 4.3 及早期版本,我必须添加代码来处理点击项,因为点击不会被普通侦听器拦截。所以,我为每个项目得到它,如下所示:

//in the adapter class for grid view insert this code
if(!Utils.hasKitKat()) {
        holder.icon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("Emoicons", " clicked");
                view.setSelected(true);
                mOnEmojiconClickedListener.onEmojiconClicked(emoji);
            }
        });
    }

其中 Utils.HasKitkat() 是一种检查它是否在 android kitkat 中运行的方法。

public static boolean hasKitKat() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
}

我希望这个解决方案对某人有用。

【讨论】:

  • 我遇到了同样的问题。谢谢你。你救了我的命。
  • 我很乐意帮助别人! :D
【解决方案2】:

我最近遇到了一个非常相似的问题,但是我的场景有点不同,因为我试图在 android ListView 中嵌入一个 EditBox(GridView 不会有任何区别)。

问题在于 GridViewItem 试图获得焦点而不是 ImageView,因此它会导致控件获得焦点的意外问题。

这样想...而不是选择 ImageView(如您所愿),而是 GridViewItem 获得焦点,这就是导致您的问题的原因。

我通过删除列表视图并实现包含在 ScrollViewer 中的垂直方向的 LinearView 解决了这个问题,我想您可能需要考虑做同样的事情...

替代方法是将通常由 ImageView 单击处理的代码放置在网格视图上的 ItemClickListener 内,而不是每个 ImageView 上。

gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
        }
};

这对你来说可能是一个更简单的解决方案。

【讨论】:

  • 感谢您的回答!我使用第二种方法来拦截项目点击:gridview 的侦听器,而不是每个图像视图的侦听器!但是,我有这个问题!
  • 如果您仍然有这个问题,那么您需要发布一些代码,以便我们可以更好地了解正在发生的事情。
  • 我解决了问题。或者更好的是,我绕过了这个问题。我为每个项目使用了 Android 4.3 的单个 itemclick 侦听器,而对于 android 4.4,我为 gridview 使用了 clicklistener!
  • 是的,我会的。我现在很忙!我会尽快做的!
  • 与接受某人在忙碌的工作日中抽出时间来帮助您的答案相比,输入该评论肯定需要更长的时间吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多