【问题标题】:How to refreshing a fragment on MenuitemSelected of its activity?如何刷新其活动的 MenuitemSelected 上的片段?
【发布时间】:2018-11-03 08:08:33
【问题描述】:

当用户单击菜单操作栏中的刷新图标时,我想刷新片段的内容。

我的应用程序在一个带有视图寻呼机的活动上具有三个片段;我尝试通过在onOptionsItemSelected() 中调用它们来刷新所有这些,并且我对它们执行了事务,当用户单击刷新菜单时应用程序崩溃。

我读过这个问题,它可能和我的相似,但我找不到合适的答案来解决我的问题:android: menu item click event from fragment我也读过这篇文章:但没有任何帮助: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;
}

我确实需要帮助。亲切的问候!

【问题讨论】:

  • 在此处添加崩溃日志
  • 你能从片段中刷新吗?
  • @SuhaibRoomy 我也试过了,我叫它onOptionsItemSelected(),但它根本不起作用:看看我是如何在同一个片段中做到的:@Override public boolean onOptionsItemSelected(MenuItem item){ switch (item.getItemId()) { case R.id.refresher_id: getFragmentManager().beginTransaction().detach(this).attach(this).commitNow(); } return super.onOptionsItemSelected(item); } 这些代码是片段当前,但是当我单击刷新图标时,刷新不起作用
  • @SuhaibRoomy 崩溃日志?好吧,它说“您的应用程序停止工作”
  • 我要从 logcat 获取日志

标签: android android-fragments fragment android-listfragment fragmenttransaction


【解决方案1】:

只需在刷新按钮的onclick中写入片段事务

 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 的 Fragment。您可以在这个 Fragment 中编写检查网络连接、电子邮件验证等常用功能。

【讨论】:

  • 我应该把这些代码放在它自己的片段中还是放在它的活动中?
  • 写入Activity
  • 我去试试,这个片段this.fragment是什么?
  • 你必须像 public static BaseFragment 片段一样初始化 BaseFragment 的对象;
【解决方案2】:

像这样在片段中添加方法刷新

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

}

【讨论】:

  • 不幸的是,它一直告诉我“您的应用程序已停止”
  • 你必须发布 logcat,没有它很难提供帮助
  • 您能否发布您的片段之一的代码,我认为如果您可以在片段中编写一些刷新代码然后调用该方法而不是分离和附加您的片段会更好,这将修复你的问题
  • 我更新了问题并添加了一个片段的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2017-08-09
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多