1

Fragment一部である がありViewPagerます。これFragmentで私にはViewGroup子供がいます。さて、 my とをインスタンス化した後、なぜ myで、 myが取得されるMainActivityのでしょうか?onCreate()ViewPageradapterContainernull

これが私のものonCreate()です:

private MyAdapter mAdapter;
private ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mAdapter = new MyAdapter(getSupportFragmentManager());

    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

    mContainerView = (ViewGroup) findViewById(R.id.container);
    //Here mContainerView is already null
    ...
}

を含むFragmentの一部である を次に示します。ViewPagermContainerView

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- This is my ViewGroup -->
   <LinearLayout android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:showDividers="middle"
        android:divider="?android:dividerHorizontal"
        android:animateLayoutChanges="true"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" />

</ScrollView>

<TextView android:id="@android:id/empty"
    style="?android:textAppearanceSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:padding="32dp"
    android:text="@string/message_empty_layout_changes"
    android:textColor="?android:textColorSecondary" />

</FrameLayout>
4

1 に答える 1

1

私があなたの質問を正しく読んでいれば、 'sメソッドを使用してFragment's View(および子)にアクセスしようとしています。は独自のレイアウトを膨張させ、伝統的ではないため、これは機能しないはずです。ActivityfindViewById()FragmentFragmentsViews

がインスタンス化されていることがわかっていて、それを取得できる場合は、使用してFragmentのインスタンスを取得できます。ViewGroup

yourFragment#getView().findViewById()

そうでない場合は、引数としてActivitya を受け入れるメソッドを使用して実装するインターフェイスを作成できます。ViewGroup次に、フラグメントので、フラグメントにインターフェイスにオフをonCreateView()渡します。ViewGroupに直接キャストできますActivityが、インターフェイスはよりクリーンです。

例えば

public class Fragment {

 public interface ViewGroupCreateListener{

     public void onViewGroupCreated (ViewGroup v);
 }

 private ViewGroupCreateListener listener;

 public void onAttach (Activity a){
     super.onAttach (a);
     listener = (ViewGroupCreateListener) a;
 }

public View onCreateView (/*all its arguments here*/){
    View v = inflater.inflate (R.layout.your_layout);
    ViewGroup group = v.findViewById (R.id.container);
    listener.onViewGroupCreated(group);

    return v;
 }

}

あなたActivityは次のようになります:

public class MainActivity extends Activity implements ViewGroupCreateListener, OtherInterface1, OtherInterface2{

  private ViewGroup mViewGroup;


  public void onViewGroupCreated (ViewGroup v){
     mViewGroup = v;
  }
}

ページャが を再インスタンス化してFragmentも、アクティビティは の有効なインスタンスを引き続き取得するため、これは便利ですViewGroup

または、 this で実際に達成しようとしていることに応じて、ViewGroupこの処理を内部で実行できる場合がありますFragment

于 2013-08-07T00:56:06.393 に答える