2017-04-07 84 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"); 

如果您遇到任何困難,您可以提出您的問題。

相關問題