具有子片段的接口实现的调用方法来自容器活动Android

时间:2013-12-11 11:26:22

标签: android interface android-fragments

我坚持使用界面进行活动和片段之间的通信。我用子片段创建了活动。我想做一些在活动中定义的连续线程的东西,在那个线程中当我得到一些结果时,我想触发子片段来做某事。

我的容器活动

public class MySpaceActivity extends BaseDrawerActivity {

private OnSetLastSeenListener mListner;

public static Thread mThread = null;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    super.setHeaders(Const.MY_SPACE);
    super.setSubmenus(Const.MY_SPACE,
            Utils.getSubmenuList(Const.MY_SPACE, MySpaceActivity.this),
            submenuBean);
    // super.attachFragment(submenuBean);
}

@Override
public void setHeaderSubMenu(SubmenuBean subMenuBean) {
    // txt_submenu.setText(subMenuBean.getSubmenu_name());
    this.submenuBean = subMenuBean;
    Log.print("::::: setHeaderSubMenu ::::");
    super.attachFragment(submenuBean);
}

public void setsubFragment(SubmenuBean subMenuBean) {
    this.submenuBean = subMenuBean;
    super.attachSubFragment(submenuBean);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    popLastFragment();
}


private void popLastFragment() {
    if (super.getNumberOfChilds() > 1) {
        super.popSubFragment();
    } else {
        finish();
    }
}

@Override
protected Fragment getFragement() {

        StudentsFragment fragment = new StudentsFragment(Const.MY_SPACE,
                getSubmenubean());
        return fragment;

}

public SubmenuBean getSubmenubean() {
    return submenuBean;
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    mThread = new Thread(new CountDownTimer(MySpaceActivity.this));
    mThread.start();
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();

    if (mThread.isAlive()) {

        mThread.interrupt();
        mThread = null;
    }

}

public void updateLastSeen(){

        Log.print("::::::Call Interface::::::");
        mListner.updateLastSeen();
     }

class CountDownTimer implements Runnable {

    private Context mContext;
    private JSONObject mJsonObject;
    private JSONArray mJsonArray;

    public CountDownTimer(Context mContext) {

        this.mContext = mContext;

    }

    // @Override
    public void run() {

        while (!Thread.currentThread().isInterrupted()) {
            try {

                HttpChatLastSeen mChat = new HttpChatLastSeen();
                mJsonObject = mChat.Http_ChatLastSeen(mContext);

                String mResult = mJsonObject.getString("Result");

                if (mResult.equalsIgnoreCase(String
                        .valueOf(Const.RESULT_OK))) {

                    mJsonArray = mJsonObject.getJSONArray("UserData");

                    for (int i = 0; i < mJsonArray.length(); i++) {

                        mJsonObject = mJsonArray.getJSONObject(i);

                        new DbStudentMasterBll(mContext).update(
                                "last_seen", mJsonObject
                                        .getString("LastSeen"), Integer
                                        .parseInt(mJsonObject
                                                .getString("UserId")));
                    }

                } else {

                    Log.print("MY LAST SEEN Response : "
                            + mJsonObject.toString());
                }

                updateLastSeen();

                Thread.sleep(15000);

            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();

            } catch (Exception e) {

                Log.print("ChatLastSeenThread : ", e.getMessage());
            }
        }
    }

   }

  }

我的孩子片段与界面:

public class StudentsFragment extends Fragment implements OnSetLastSeenListener{

TextView txt_submenu;
ListView list_students;
SubmenuBean submenuBean;
int Mainmenu;
MySpaceActivity mMySpaceActivity;
ArrayList<DbStudentMasterBean> studentsList;
StudentsAdapter mAdapter = null;
OnSetLastSeenListener mListner;

public StudentsFragment() {
    super();
}

public StudentsFragment(int Mainmenu, SubmenuBean submenuBean) {
    this.submenuBean = submenuBean;
    this.Mainmenu = Mainmenu;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_students, container,
            false);
    mMySpaceActivity = (MySpaceActivity) getActivity();

    txt_submenu = (TextView) view.findViewById(R.id.txt_submenu);
    txt_submenu.setText(submenuBean.getSubmenu_name());
    txt_submenu.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            mMySpaceActivity.openDrawer();
        }
    });
    list_students = (ListView) view.findViewById(R.id.list_colleagues);


    studentsList = new DbStudentMasterBll(getActivity()).getAllRecords();

    mAdapter = new StudentsAdapter(getActivity(), studentsList, handler);
    list_students.setAdapter(mAdapter);
    list_students.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            DbStudentMasterBean bean = (DbStudentMasterBean) parent
                    .getAdapter().getItem(position);

            Message msg = new Message();
            msg.what = CHAT;
            msg.obj = bean;

            handler.sendMessage(msg);
        }
    });

    return view;
}

Handler handler = new Handler() {

    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {

        case CHAT:
            submenuBean.setTag(VIEWCHATSTUDENT);
            DbStudentMasterBean bean = (DbStudentMasterBean) msg.obj;
            mMySpaceActivity.setsubFragment(submenuBean);

            break;
        }
    };

};

@Override
public void updateLastSeen() {
    // TODO Auto-generated method stub
    Log.print("!!!!!!!!!Refresh Adapter!!!!!!!!!!!");
    mAdapter.notifyDataSetChanged();
}


}

我的界面:

  public interface OnSetLastSeenListener {

    public void updateLastSeen();

  }

所以我用我的子片段 StudentsFragment 实现了接口 OnSetLastSeenListener 。现在我用线程从我的容器活动中调用接口 updateLastSeen()的方法。但它没有触发我实现接口的子片段。所以我不知道这是否是好的沟通方式?让我帮助建议这个解决方案或从子片段到父母活动的最佳沟通方式。

谢谢,

1 个答案:

答案 0 :(得分:2)

最好在想要传达interface Fragment的内容时使用Activity,反之亦然。

在您的情况下,您可以从FragmentActivity直接在fragment object中调用该方法。无需使用界面。

像这样(对于静态片段)

 StudentsFragment fragment = (StudentsFragment) getFragmentManager()
                .findFragmentById(R.id.fragmentid);
 if (fragment != null && fragment.isInLayout()) {
       fragment.updateLastSeen();
  } 

对于动态片段,您可以直接使用片段对象。