28

私はAndroidガイドhttp://developer.android.com/guide/components/fragments.html#CommunicatingWithActivityのようなAndroidでフラグメント通信を実装しようとしています

しかし、getSupportFragmentManager()。findFragmentById()がnullを返すため、アプリケーションがクラッシュします。私の実装の問題は何ですか。

コードを以下に示します。

プログラムは、最初のfragmnetからのボタンクリックを介して、あるフラグメントから別のフラグメントtextView領域に入力テキストを送信するだけです。activity_main.xmlと2つのフラグメントレイアウト(activity_main.xmlの一部ではなく2つの別個のxmlファイル)があります。

Frag1.java

public class Frag1 extends Fragment {
public Frag1(){

}

buttonClickListener buttonListener;

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
    buttonListener = (buttonClickListener) getActivity();
} catch (ClassCastException e) {
    throw new ClassCastException(activity.toString() + " must implement OnButtonPressListener");
}
}

View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    myFragmentView = inflater.inflate(R.layout.frag1, container, false);


    //SetValue Button
    Button setValueButton = (Button) myFragmentView.findViewById(R.id.setValueButton);
    setValueButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            buttonListener.onButtonPressed("Message received");
        }
    });


    return myFragmentView;
}

}

Frag2.java

public class Frag2 extends Fragment {

View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
 myFragmentView = inflater.inflate(R.layout.frag2, container, false);
    return myFragmentView;
}

void setMessage(String msg){
    TextView txt=(TextView)myFragmentView.findViewById(R.id.textView1);
    txt.setText(msg);
}
}

buttonClickListener.java

public interface buttonClickListener {
public void onButtonPressed(String msg);
}

MainActivity.java

public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener, buttonClickListener {
SectionsPagerAdapter mSectionsPagerAdapter;
@Override
public void onButtonPressed(String msg) {
    // TODO Auto-generated method stub
    Frag2 fragmentObj=(Frag2) getSupportFragmentManager().findFragmentById(R.layout.frag2);


    fragmentObj.setMessage(msg);
}

どこがうまくいかなかったのか教えてください。

編集:AndroidプラグインEclipseIDEによって生成されたテンプレートを使用したフラグメント作成を使用しています。したがって、フラグメントはandroid.support.v4.app.Fragmentを使用して作成されます

@Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch(position)
        {
        case 0:
            return new Frag1();
        case 1: 
            return new Frag2();
        }
        return fragment;
    }

コードベースは参照用にここに保持されます https://skydrive.live.com/redir?resid=D37E0F56FEC9B499!259

4

5 に答える 5

25

これを試してみてくださいそれは私のために働きますViewPagerを使用してフラグメントにGoogleマップV2を置く方法

<fragment
            android:id="@+id/map"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment" />

GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();
于 2015-04-29T13:02:59.400 に答える
19

を呼び出すことによってフラグメントFrag2を追加する必要があります

getSupportFragmentManager().beginTransaction().add(R.id.frag2_view, new Frag2(), "tag").commit();

MainActivityで、ここで、はmain_layoutでR.id.frag2_view定義されたレイアウトです。

そのフラグメントを取得するには、電話する必要があります

Frag2 obj = (Frag2)getSupportFragmentManager().findFragmentById(R.id.frag2_view);

main_layoutにフラグメントを追加するために使用したレイアウトIDを渡します。

それが役に立てば幸い。

編集:

ViewPagerを使用するため、IDとしてR.id.pagerを使用する必要があります。私はあなたの例を試してみましたが、うまくいきました。

Frag2 fragmentObj=(Frag2) getSupportFragmentManager().findFragmentById(R.id.pager);

編集2:

R.id.pagerはViewPagerからのものであり、たとえばfrag4frag5を見つけることができないため、これは機能しましたが、実際には正しい方法ではないと思います。

私の答えは無視してください。申し訳ありませんが、ViewPagerでそれを行う方法がわかりません。

于 2013-03-20T14:03:34.813 に答える
7

私は同様の問題を抱えていました、そしてここに解決策があります。ビューページャー内の適切なフラグメントへの参照を取得するには、次を呼び出します。

getSupportFragmentManager().findFragmentByTag(tag);  

タグパラメータは、次の構文を使用して作成できます。"android:switcher:pager_id:index"ここpager_idで、はXMLレイアウトのViewPagerのIDであり、インデックスはViewPagerゼロから始まるフラグメント内のフラグメントの位置です。ここで元の応答を参照してください: https ://stackoverflow.com/a/7393477/2423274

于 2013-09-27T00:36:22.840 に答える
5

この質問に対する正しい解決策を見つけました。

もっと多くの人がこれを見ることを願っています。

Frag2 fragmentObj=(Frag2) mSectionsPagerAdapter.getItem(2);

フラグメント参照を取得するためのソースとして、アダプター(フラグメントを取り込む場所)を使用する必要があります。

于 2018-01-05T22:58:32.430 に答える
0

これを使用して、フラグメントアダプタから子フラグメントを取得しました...

Fragment parent = MainActivity.this.getSupportFragmentManager().findFragmentById(R.id.main_container);
        if (parent instanceof PagerFragment) {
            // do something with parent
            Fragment child = ((PagerFragment) f).adapter.getItem(childPosition);
        }
于 2017-06-07T15:23:58.027 に答える