在Android 4.3及更低版本中使用getChildFragmentManager的奇怪行为

时间:2014-05-12 10:38:58

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

我遇到了getChildFragmentManager方法的问题。

我用它在viewpager中创建了几个嵌套片段。这个Viewpager在PopupWindow中。 通过这种方式,片段被创建,我可以在UI中看到它们。 片段包含gridview。

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

要拦截项目点击,我使用回调来调用Activity,而Activity onAttach方法是正确的。

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

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

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

我最近遇到了一个非常类似的问题但是我的情况有点不同,因为我试图在一个Android ListView中嵌入一个EditBox(GridView没有区别)。

问题是GridViewItem尝试获得焦点而不是ImageView,因此它会导致意外问题,哪个控件可以获得焦点。

可以这样想......而不是选择ImageView(你可能想要),GridViewItem正在获得焦点,而这正是造成你问题的原因。

我通过删除listview并实现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();
        }
};

这可能是一个更容易解决的问题。

相关问题