【问题标题】:Call Fragment B from Fragment A using ViewPager Tabs使用 ViewPager 选项卡从片段 A 调用片段 B
【发布时间】:2017-04-07 20:56:41
【问题描述】:

我做过很多程序,我在单个 Activity 中实现了多个 Fragment,但在使用 Single Activity 将多个 Fragment 托管为选项卡然后点击显示另一个 Fragments 时没有...

使用 MaterialViewPager library,我在其中调用不同的 Fragment 以在各自的选项卡中显示视图。

对于第一个选项卡,我使用两个片段,其中

在第一个片段中,我使用 RecyclerView... 来显示菜单列表。

在第二个片段中,我使用 RecyclerView... 来显示特定菜单下的项目列表。

所以我的问题是如何从片段中调用片段。

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), mRecyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {

                Value value = valueList.get(position);
                List<Learning> learning = value.getLearning();

                // using when putting "item" data into same recyclerview
                // but on back press just exiting, not showing list of Menus again
                /**
                learningAdapter = new LearningAdapter(learning, R.layout.card_learning, getActivity());
                mRecyclerView.setAdapter(learningAdapter);
                **/

                ItemFragment fragment = new ItemFragment();
                replaceFragment(fragment);

            }

方法replaceFragment

public void replaceFragment(Fragment someFragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    // using Fragment not Activity, so where can I use frame_container in xml
    transaction.replace(R.id.frame_container, someFragment); 
    transaction.addToBackStack(null);
    transaction.commit();
}

【问题讨论】:

  • 这里怎么了???为什么它被否决了?
  • 检查我的答案。不用担心。你的问题很清楚。

标签: android android-fragments


【解决方案1】:

您可以拥有一个由承载这两个片段的活动实现的回调接口。片段 A 将使用回调通知活动将 A 替换为片段 B。根据您的需要,您可以通过回调方法本身传递参数。

你的回调接口:

public interface YourCallback {
    public void methodWhichReplacesFragmentAwithB(params...);
}

您的 Activity 托管片段:

public class YourActivity extends ... implements YourCallback {
  ..
  ..
  @Override
  public void methodWhichReplacesFragmentAwithB(params...) {
    //insert replace fragment code here
  }
}  

您的片段将有一个回调对象YourCallback callbackObj;。这个回调对象可以使用活动(作为this 从活动传递)本身来初始化,因为活动具有接口的实现。现在,您可以使用

callbackObj.methodWhichReplacesFragmentAwithB(actual_params...);

替换片段。此回调接口可用于与父 Activity 以及该 Activity 中托管的其他 Fragment 进行其他通信。

【讨论】:

  • 如果您详细说明答案,可能会对问题所有者有所帮助。
  • 我做过很多程序,我在单个 Activity 中实现了多个 Fragment,但在使用 Single Activity 将多个 Fragment 托管为选项卡然后点击显示另一个 Fragments 时没有...
  • @Sophie 我已经添加了解释。让我知道,如果它不适合您的问题。 :)
【解决方案2】:

要替换片段,

FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, someFragment).addToBackStack("null").commit();

【讨论】:

    【解决方案3】:

    你可以试试这个:

    YourFragment fragment = new YourFragment();
    FragmentTransaction transaction = ((AppCompatActivity) mContext).getSupportFragmentManager()
                                .beginTransaction();
    transaction.replace(R.id.frame, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
    

    【讨论】:

      【解决方案4】:

      我很久以前就一直在使用一个选项。我将通过明确的示例添加解决方案。

      所以你想将值从fragment A 传递给fragment B

      所以,在这里你想要做的是,你已经通过活动传递了价值。

      1) 你将值从fragment A 传递给activity

      2) 然后activityfragment B

      第一步:首先在fragment A中创建如下界面

         public interface HomePage {
            void onHomeButtonsClicked(String clickedButton);
         }
      
         public void setOnHomeButtonClicked(HomePage homePage) {
           this.homePage = homePage;
         }
      

      第 2 步: 然后在 Activity 中创建如下所示的实例。在 PagerAdapter 中创建的片段

       ((FragmentA) fragment).setOnHomeButtonClicked(new FragmentA.HomePage() {
                          @Override
                          public void onHomeButtonsClicked(String buttonClicked) {                         
                                  pageSelected.onHomeButtonsClicked(selectedPage);                          
                              }
                          }
                      });
      

      第 3 步:然后在 Activity 中创建界面,如下所示。

      public interface PageSelected {
          void onHomeButtonsClicked(String clickedButton);
      }
      
      public void setOnHomeButtonClicked(PageSelected pageSelected) {
          this.pageSelected = pageSelected;
      }
      

      第三步:然后在fragment B的onCreateView或onResume()中添加如下方法

        ((MainActivity) getActivity()).setOnHomeButtonClicked(new MainActivity.PageSelected() {
              @Override
              public void onHomeButtonsClicked(String clickedButton) {
                  //fragment B received the value here 
              }
          });
      

      第五步:最后在fragment A按钮点击或者你想传递值的地方添加行。

       homePage.onHomeButtonsClicked("Some String , by this code it is in String. you can change in your own data type");
      

      如果您遇到任何困难,可以提出您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多