Как обновить фрагмент на MenuitemSelected его активности? - PullRequest
0 голосов
/ 24 мая 2018

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

Мое приложение содержит три фрагмента в одном действии с пейджером представления;Я попытался обновить их все, вызвав их в onOptionsItemSelected(), и я выполнил с ними транзакции, приложение закрывается, когда пользователь щелкает меню обновления.

Я прочитал этот вопрос, он, вероятно, похож на мой, ноЯ не смог найти подходящий ответ для решения моей проблемы: android: событие щелчка по пункту меню из фрагмента Я тоже читал эту статью: но мне ничего не помогло: https://developer.android.com/guide/topics/ui/menus возможно, я не делаю этого

Мой код обновления всех трех фрагментов в упражнении приведен ниже:

@Override
public boolean onOptionsItemSelected(MenuItem item){
    Fragment sentMsg=getSupportFragmentManager().findFragmentByTag("fragmentSentMsg");
    Fragment receivedMsg=getSupportFragmentManager().findFragmentByTag("fragmentReceivedMsg");
    Fragment allMsg=getSupportFragmentManager().findFragmentByTag("fragmentAllMsg");
    FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();

    switch (item.getItemId()){
        case R.id.refresher_id:
            fragmentTransaction.detach(sentMsg).attach(sentMsg).commit();
            fragmentTransaction.detach(receivedMsg).attach(receivedMsg).commit();
            fragmentTransaction.detach(allMsg).attach(allMsg).commit();

            break;
    }

    return super.onOptionsItemSelected(item);
}

Это код одного фрагмента:

public class Page2_sent_msg extends Fragment {

//default constructor
public Page2_sent_msg(){}

@SuppressLint("ResourceType")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
    final View Page2_sent_msg=inflater.inflate(R.layout.page2_sent_msg,container,false);


 ListView sentMsgListView=(ListView)Page2_sent_msg.findViewById(R.id.sentMsgListview);
 ArrayList<String> sentMsgArrayList=new ArrayList<String>();
 SQLite_database_helper_class myDb=new SQLite_database_helper_class(getContext());
 Cursor result=myDb.getting_sms_from_db();
 if (result.moveToFirst()){
     do {
         if (!result.getString(3).equals("Sent message")){
             continue;
         }else{
             sentMsgArrayList.add("SMS No : "+result.getString(0)+"\n"
                     +"Address : "+result.getString(1)+"\n"
                     +"Date : "+result.getString(2)+"\n"
                     +"Type : "+result.getString(3)+"\n"
                     +"Content : "+"\n________\n\n"+result.getString(4)+"\n");
         }
     }while (result.moveToNext());
 }
 ArrayAdapter<String>sentMsgAdapter=new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1,sentMsgArrayList);
 sentMsgListView.setAdapter(sentMsgAdapter);
 sentMsgListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         //this is what will happen when a user clicks one item from the lis view
     }
 });

 Page2_sent_msg.setTag("sentMsg");


return Page2_sent_msg;
}

Мне действительно нужна помощь.С уважением!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Добавьте метод обновления в ваш фрагмент следующим образом

public void refreshFragment() {
    sentMsgArrayList.clear();
    sentMsgAdapter.notifyDataSetChanged();
    SQLite_database_helper_class myDb=new SQLite_database_helper_class(getContext());
    Cursor result=myDb.getting_sms_from_db();
    if (result.moveToFirst()){
        do {
            if (!result.getString(3).equals("Sent message")){
                 continue;
            }else{
                 sentMsgArrayList.add("SMS No : "+result.getString(0)+"\n"
                 +"Address : "+result.getString(1)+"\n"
                 +"Date : "+result.getString(2)+"\n"
                 +"Type : "+result.getString(3)+"\n"
                 +"Content : "+"\n________\n\n"+result.getString(4)+"\n");
             }
        }while (result.moveToNext());
        sentMsgAdapter.notifyDataSetChanged
   }

Затем вызывайте его, когда пользователь нажимает на обновление

@Override
public boolean onOptionsItemSelected(MenuItem item){
Fragment sentMsg=getSupportFragmentManager().findFragmentByTag("fragmentSentMsg");
Fragment receivedMsg=getSupportFragmentManager().findFragmentByTag("fragmentReceivedMsg");
Fragment allMsg=getSupportFragmentManager().findFragmentByTag("fragmentAllMsg");

switch (item.getItemId()){
    case R.id.refresher_id:
        sentMsg.refreshFragment();
        receivedMsg.refreshFragment();
        allMsg.refreshFragment();
        break;
}

return super.onOptionsItemSelected(item);

}

0 голосов
/ 24 мая 2018

Просто напишите транзакцию фрагмента в одно нажатие кнопки обновления.

 fragment = new HomeFragment();
        onFrangmentChange(fragment, true, false);

Функция onFrangmentChange будет выглядеть следующим образом

    private void onFrangmentChange(BaseFragment fragment, boolean replace, 
  boolean addBackstack) {
    this.fragment = fragment;

    fm = getFragmentManager();

    ft = fm.beginTransaction();
    if (replace) {
        ft.replace(R.id.fragment, fragment);
    } else {
        ft.add(R.id.fragment, fragment);
    }
    if (addBackstack) {
        ft.addToBackStack(fragment.getClass().getSimpleName());
    }
    ft.commit();
}

Примечание: BaseFragment - это не что иное, как фрагмент, расширяющий Fragment.YouВ этом фрагменте можно написать общие функции, такие как проверка сетевого подключения, проверка электронной почты и т. д.

...