2013-12-11 4 views
2

Я застрял в связке между активностью и фрагментом, используя интерфейс. Я создал активность с дочерним фрагментом. Я хочу сделать некоторые вещи с непрерывным потоком, определенным в действии, и во время этого потока, когда я получаю некоторый результат в то время, я хочу вызвать дочерний фрагмент, чтобы что-то сделать.Вызов метода интерфейса с дочерним фрагментом Из активности контейнера Android

Мой Контейнерный активность

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(); 

    } 

Так я реализовал интерфейс OnSetLastSeenListener с моим фрагментом детской StudentsFragment. Теперь я вызываю метод tht интерфейса updateLastSeen() из моей активности контейнера с потоком. Но он не получает триггер для дочернего фрагмента, где я реализовал интерфейс. Поэтому я не знаю, хороший ли это способ общения или нет? Позвольте мне обратиться за помощью к этому решению или наилучшему способу общения от дочернего фрагмента к родительской активности.

Спасибо,

ответ

1

Лучше использовать interface если вы хотите сообщить что-то от FragmentкActivity, а не наоборот.

В вашем случае вы можете напрямую вызвать метод в Fragment от Activity до fragment object. Не нужно использовать интерфейс.

Что-то вроде этого (для статических фрагментов)

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

Для динамического фрагмента можно использовать объект фрагмента непосредственно.

+0

Когда я делаю так, как вы сказали, он вызывает этот метод несколько раз, даже если он должен быть вызван только один раз. Не знаете, почему? – Jai

+0

Это не статический фрагмент. Это динамический фрагмент! – Jai

+0

Для динамического фрагмента вы можете напрямую использовать объект фрагмента. Я думаю, что вы вызываете 'updateLastSeen();' inside 'while' loop.put это вне' while loop' –

Смежные вопросы