2017-04-07 87 views
-1

我已经完成了很多程序,其中我已经在单个活动中实现了多个片段,但在使用单个活动将多个片段作为选项卡放置并点击显示另一片段时没有。使用ViewPager选项卡从片段A调用片段B

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

像第一个选项卡,我使用的两个片段,其中

在第一块碎片,我使用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(); 
} 
+0

这里有什么问题?为什么它被降低了? – Sophie

+0

检查我的答案。不用担心。你的问题很清楚。 – Noorul

回答

1

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

您的回调接口:

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

您的托管活动片段:

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

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

callbackObj.methodWhichReplacesFragmentAwithB(actual_params...);

更换片段。此回调接口可用于其他父活动的通信以及该活动中托管的其他片段。

+0

如果您详细说明了答案,它可能有助于问题所有者。 – Noorul

+0

我已经完成了许多程序,其中我已经在单个活动中实现了多个片段,但是在使用单个活动将多个片段作为选项卡进行托管,然后再点击时显示另一个片段...... – Sophie

+0

@Sophie我添加了一个解释。让我知道,如果它不适合你的问题。 :) – Mithun

0

要更换片段,

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

你可以试试这个:

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

还有就是我已经从很久以前使用其中一个选项。我将以清晰的例子添加解决方案。

所以,你要的值传递从fragment Afragment B

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

1)从fragment A值传递给activity

2)然后activityfragment B

步骤1:fragment A

public interface HomePage { 
     void onHomeButtonsClicked(String clickedButton); 
    } 

    public void setOnHomeButtonClicked(HomePage homePage) { 
    this.homePage = homePage; 
    } 

步骤首先建立一个接口象下面2:然后在Activit中创建如下所示的实例年。其中片段在PagerAdapter

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

步骤3中创建:然后创建接口在活动像的下方。

public interface PageSelected { 
    void onHomeButtonsClicked(String clickedButton); 
} 

public void setOnHomeButtonClicked(PageSelected pageSelected) { 
    this.pageSelected = pageSelected; 
} 

步骤3:然后在onCreateView或的onResume()中添加以下方法在fragment B

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

步骤5:最后添加行中fragment A在按钮点击或要在其中传递价值。

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

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

相关问题