同一片段的几个实例 - 事件不适用于所有实例化片段

时间:2014-07-02 11:43:48

标签: android events android-fragments listener reusability

我正在实现一个具有不同组的信使,我创建了一个片段及其相关的布局,我想为不同的组重用它。

我正在使用DrawerList视图来选择不同的片段。 我创建了一个包含不同组的Fragment数组,第一次实例化所有片段并将它们隐藏到FragmentManager中。这可能不是最优雅的,如果你有更好的主意,请不要犹豫。

我可以显示我想要的不同视图,并填充相应的列表视图。

FragmentMessengers包含一个发布按钮,我的问题是这个事件只对我实例化的2个片段之一起作用(未触发)。 我试图取消注册,然后通过方法update()/ removeListener()注册事件,但我有相同的结果。

如何管理这些听众?

以下是一些片段:

片段信使的初始化:

private static Fragment[] mFragmentMessengers;

选择:

        if (mFragmentMessengers == null){
            mFragmentMessengers = new MessageListFragment[topicKeys.length];
            for (int i=0; i<topicKeys.length;i++){              
                mFragmentMessengers[i] = new MessageListFragment();
                Bundle data = new Bundle();
                data.putString(MessageListFragment.TOPIC_NAME, mTopics[i]);
                mFragmentMessengers[i].setArguments(data);
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.add(R.id.content_frame, mFragmentMessengers[i],"MESS_"+i);
                ft.hide(mFragmentMessengers[i]);
                ft.commit();
            }
        }
        // Test previousPosition
        Fragment mlf = mFragmentMessengers[previousPos];
        ((MessageListFragment)mlf).removeListener();
        fragmentManager.beginTransaction().hide(mlf).commit();

        Fragment mlf = mFragmentMessengers[pos];    
        ((MessageListFragment)mlf).update();
        fragmentManager.beginTransaction().show(mlf).commit();

MessageListFragment:

public class MessageListFragment extends ListFragment implements OnEditorActionListener {

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    EditText editText = (EditText) getActivity().findViewById(R.id.publishMessage);
    editText.setOnEditorActionListener(this);
}

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    Log.d(TAG,"onEditorAction "+actionId + " topic_name "+topic_name);
    return true;
}

public void update()
{
    Log.d(TAG,"update "+topic_name);
    try
    {
            EditText editText = (EditText) getActivity().findViewById(R.id.publishMessage);

            if (editText != null)
            {
                editText.setOnEditorActionListener(this);
            }
    }catch(Exception e){
        Log.d(TAG,"update Exception");
    }
}

public void removeListener()
{
    Log.d(TAG,"removeListener "+topic_name);
    try
    {
        EditText editText = (EditText) getActivity().findViewById(R.id.publishMessage);
        if (editText != null)
            editText.setOnEditorActionListener(null);
    }catch(Exception e){
        Log.d(TAG,"update Exception");
    }
}
}

0 个答案:

没有答案