0

我在主活动中有一个浮动操作按钮(FAB),下面有4个片段标签。Android:在主活动提示中输入数据后刷新当前显示的ViewPager片段标签

当单击FAB时,根据显示哪个选项卡,我有单独的对话框提示输入数据。

现在对于第一个选项卡,我可以在输入数据后立即刷新片段的内容,然后使用Interface在对话框提示中单击确定。但是,对于制表符2-4,在每个选项卡2-4的相应对话框提示中单击确定后,我无法一次刷新数据。我必须点击第一个选项卡,然后返回到之前显示的选项卡才能刷新视图。

我想要做的是:

从第二/第三/第四个选项卡,输入数据,然后点击输入对话框提示输入相应的标签后,当前显示的选项卡,应立即更新里面的意见根据我在对话框中输入的内容并保存到数据库中。

请注意,在单击提示中的确定按钮后,我将输入保存到数据库中。

我该怎么做?先谢谢您,我感谢您的帮助!:)

这里是我的代码(我使用的接口):

public class MyActivity extends AppCompatActivity { 
 

 
    private PopupListener popupListener; 
 

 
    @Override 
 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
 
    super.onCreate(savedInstanceState); 
 
    //Your dialog code. 
 
    setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
 
     @Override 
 
     public void onClick(DialogInterface dialog, int which) { 
 
     popupListener.onDialogClick("first_tab"); //"second_tab" for second tab, and so on... 
 
     } 
 
    }) 
 
    } 
 

 
    public void setPopupListener(PopupListener popupListener) { 
 
    this.popupListener = popupListener; 
 
    } 
 

 
    public interface PopupListener { 
 
    void onDialogClick(String value); 
 
    } 
 
}

码在第2标签:

public class MyFragment extends Fragment { 
 

 
    @Override 
 
    public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { 
 
    super.onViewCreated(view, savedInstanceState); 
 
    ((MyActivity) getActivity()).setPopupListener(new MyActivity.PopupListener() { 
 
     @Override 
 
     public void onDialogClick(String value) { 
 
     //After clicking dialog ok button in Activity 
 
     setUserVisibleHint(true, view); // get value from the database here. 
 
     } 
 
    }); 
 
    } 
 
}

守则更新cu rrently显示的片段(以下样品为第二标签):所有4个片段的

@Override 
 
public void setUserVisibleHint(boolean isVisibleToUser, final View view) { 
 
    super.setUserVisibleHint(isVisibleToUser); 
 
    if (isVisibleToUser) { 
 
    //get data from database and refresh view. 
 
    viewFunds(view) //method is for updating 2nd tab 
 
    } 
 
}

内部的OnCreate():

public void onCreate(@Nullable Bundle savedInstanceState) { 
 
    setUserVisibleHint(false); 
 
}

第一个标签代码:(加按注释要求)

@Override 
 
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { 
 
    super.onViewCreated(view, savedInstanceState); 
 
    ((Main2Activity) getActivity()).setPopupListener(new Main2Activity.PopupListener() { 
 
    @Override 
 
    public void onDialogClick(String value) { 
 
     //After clicking dialog ok button in Activity 
 
     // you will get value here. 
 
     viewBudget(view); //method to updated views inside first tab 
 
    } 
 
    }); 
 
}

FAB的OnClick听众:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.floatingActionButton_main2); 
 
fab.setOnClickListener(new View.OnClickListener() { 
 
     @Override 
 
     public void onClick(View view) { 
 
      int position = tabLayout.getSelectedTabPosition(); 
 

 
      switch (position) { 
 
      case 0: 
 

 
       // first tab is selected 
 

 
       //Toast.makeText(context,"0",Toast.LENGTH_LONG).show(); 
 

 

 
       break; 
 
      case 1: 
 
       // second tab is selected 
 
       //Toast.makeText(getApplicationContext(),"1",Toast.LENGTH_LONG).show(); 
 

 
       break; 
 
      case 2: 
 
       // third tab is selected 
 
       //Toast.makeText(getApplicationContext(),"2",Toast.LENGTH_LONG).show(); 
 
       UpdateableFragment.showDialog(); //ERROR: non static method onDialogClick cannot be referenced from static context 
 
       break; 
 
      case 3: 
 
       // third tab is selected 
 
       //Toast.makeText(getApplicationContext(),"3",Toast.LENGTH_LONG).show(); 
 
       break; 
 
      }

+0

我已经使用问题中提到的'Interface'。你提到'广播',你能否通过添加答案来提供更多细节?谢谢。 –

+0

添加第一个选项卡的代码(请参阅上面的更新问题)。谢谢:) –

+0

第一个片段,onViewCreated。 –

回答

0

看你的代码,我相信你的问题我s那你的活动有一个听众可以在对话框上点击确定就可以调用,但是你有四个的片段。所以只有当前注册为侦听器的一个才会得到回调。

因为你的逻辑是从活动到片段沟通,就没有必要在这里的回调(通常你使用回调沟通片段高达所属活动)。

所以你可以到相关片段的显式调用替换您的接口:

// Your dialog code. 
setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     figureOutWhichFragmentIsSelectedAndCallExplicitUpdateMethodOnIt(); 
    } 
}) 

现在,这是一个选项。我不知道你的代码或应用程序看起来像你的示例,但它听起来像显示的对话框是特定于每个片段?在这种情况下,我认为让问题片段显示对话框并处理交互本身更有意义。

所以,你可以有一个接口/为您的所有片段的基础:为他人

public TabOneFragment extends Fragment implements UpdateableFragment { 
    @Override 
    public void showDialog() { 
     // Show dialog for tab one data, register listener, save specific data 
    } 

同样的想法:

public interface UpdateableFragment { 
    void showDialog(); 
} 

然后实现此接口的每个片段。然后在活动它归结为:

myFabButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     UpdateableFragment fragment = getCurrentlySelectedFragment(); // You define this method to return the current fragment 
     fragment.showDialog(); 
    } 
} 

这意味着1)的活性具有较少的逻辑做找出哪些片段被选择,并且该方法在其上具有被称为因为它会通过一个公共接口2)你的片段不需要知道它们连接的是什么类型的活动(现在每个片段都明确地转换为MyActivity并调用其上的已知方法,这打破了封装)。

希望有帮助!

+0

谢谢@dominicoder,我研究了你的答案和提供的代码。如果我有问题,我会对其进行测试并回复给您。谢谢你的帮助! :) –

+0

@dominiicoder:是的,你是正确的,当我点击主要活动FAB时,显示的对话框是特定于每个片段的。 –

+0

嗨@dominicoder,我实现了你的代码。我的FAB OnClickListener有点不同,因为我使用'tabLayout.getSelectedTabPosition()',然后'switch'和'case'。我在情况2中添加了代码'UpdateableFragment.showDialog()',并且遇到了错误_non静态方法onDialogClick无法从静态上下文中引用。请在上面更新的问题中查看我的FAB代码。我应该如何继续?谢谢您的帮助。 –