2017-01-16 5 views
0

MainActivityのonCreateでは、xmlレイアウトのFrameLayoutフラグメントコンテナを、FragmentManagerを使用してMainFragmentのxmlレイアウトのDragSelectRecyclerViewに置き換えました。プログラマブルなフラグメントコンテナからの断片化ビューのアクセス

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getFragmentManager().beginTransaction() 
      .replace(R.id.fragmentContainer, new MainFragment()) 
      .commit(); 
} 

MainActivityのXML::次のコードは、この示し

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.gra.app.activities.MainActivity"> 

    <FrameLayout 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clipToPadding="false" 
     android:paddingTop="?attr/actionBarSize" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior=".utilities.AppBarLayoutBackgroundAlphaBehavior"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      android:theme="@style/ThemeOverlay.AppCompat.ActionBar" /> 
    </android.support.design.widget.AppBarLayout> 
</android.support.design.widget.CoordinatorLayout> 

MainFragmentのXML:

<com.afollestad.dragselectrecyclerview.DragSelectRecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/recyclerView" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:scrollbars="vertical" 
app:dsrv_autoScrollEnabled="true" 
app:dsrv_autoScrollHotspotHeight="56dp" 
tools:context="com.gra.app.fragments.MainFragment" /> 

プログラムでFrameLayoutを通じてDragSelectRecyclerViewのインスタンスにアクセスする方法はありますか?

この理由は、私はそう私はAppBarLayoutをフェードすることができMainFragmentのDragSelectRecyclerViewに依存MainActivityのXML内AppBarLayoutを作成する必要がある/アウト

CoordinatorLayout.Behavior<AppBarLayout> 

を通じて

DragSelectRecyclerView.getVerticalScrollbarPosition()

に基づきますこれは可能ですか?それともMainActivityのxml内にDragSelectRecyclerViewを移動するだけですか?

答えて

0

フラグメントトランザクションでtagを設定し、トランザクション中に設定したtagによってフラグメントとそのビューを取得することができます。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    getFragmentManager().beginTransaction() 
      .replace(R.id.fragmentContainer, new MainFragment(),"tag")  //Adding tag here 
      .commit(); 
} 

し、後であなたがして、そのフラグメント内recyclerviewを盗んことができます:あなたはこのようにそれを行うことができます

View fragmentView = getFragmentManager().findFragmentByTag("tag").getView(); 
DragSelectRecyclerView recyclerView = (DragSelectRecyclerView)fragmentView.findViewById(R.id.recyclerView) //use the view 

しかしView fragmentView = getFragmentManager().findFragmentByTag("tag").getView();は、フラグメントの状態に基づいてヌルを返すことがあります。状態。あなたはそれを見なければなりません。

2

私はMainFragmentでパブリックメソッドを持っているあなたを示唆している - これまで

public float getVerticalScrollbarPosition(){ 
    return DragSelectRecyclerView.getVerticalScrollbarPosition(); 
} 

更新MainActivityののonCreateメソッド -

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    MainFragment mainFragment = new MainFragment(); 
    getFragmentManager().beginTransaction() 
      .replace(R.id.fragmentContainer, mainFragment) 
      .commit(); 
} 

今MainActivity以内に、あなたはどこでもメソッドにアクセスすることができます値を取得し、それに応じてAppBarLayoutのイン/アウトをフェードインする -

mainFragment.getVerticalScrollbarPosition(); 

これは断片と活性との間の通信がどのように処理すべきかである - あなたは

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment android:id="@+id/fragment" 
      android:name="some.package.MainFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 
</RelativeLayout> 

などの主な活動のXMLレイアウトに直接フラグメントを設定し、DragSelectRecyclerViewのインスタンスを取得することができhttps://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

2

DragSelectRecyclerView recyclerView = (DragSelectRecyclerView) findViewById(R.id.recyclerView) 

それとも単にによってあなたの活動ののonCreateメソッドであなたの活動にあなたの断片からDragSelectRecyclerViewを設定します。

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    DragSelectRecyclerView dragSelectRecyclerView = (DragSelectRecyclerView) getView().findViewById(R.id.recyclerView); 
    Activity activity = getActivity(); 
    if (activity != null && activity instanceof MainActivity) { 
     ((MainActivity) activity).setDragSelectRecyclerView(dragSelectRecyclerView); 
    } 
} 

どちらの場合も、あなたフラグメントがなくなった後に変数をリセットしてください。

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    Activity activity = getActivity(); 
    if (activity != null && activity instanceof MainActivity) { 
     ((MainActivity) activity).setDragSelectRecyclerView(null); 
    } 
} 
+0

フラグメントコンテナとしてのFrameLayoutを使用しないで、どのフラグメントを次のフラグメントに切り替えるのですか? –

+0

私はフラグメント内で手動でツールバーアニメーションを処理することに決めました。なぜなら、CoordinatorLayout.Behaviorを使用していれば、各フラグメントに対してCoordinatorLayout、AppBarLayout、Toolbarが必要になるからです。私は、モジュール化したままにして、ツールバーを処理するだけのアクティビティを持っていたかったので、FrameLayoutを使ってフラグメントコンテナとして機能しています。あなたの助けをありがとう! –

関連する問題