getSupportFragmentManager()。findFragmentById()返回null

时间:2013-03-20 13:35:50

标签: android android-fragments

我正在尝试在Android中实现片段通信,就像在android指南http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

中实现一样

但是我的应用程序崩溃了,因为getSupportFragmentManager()。findFragmentById()返回null。我的实施有什么问题。

代码如下:

程序只是通过第一个fragmnet上的按钮点击将输入文本从一个片段发送到另一个片段textView区域。我有一个activity_main.xml和两个片段布局(两个单独的xml文件,而不是activity_main的一部分)。 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 Plug-in eclipse IDE生成的模板创建片段。 所以片段是使用 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

5 个答案:

答案 0 :(得分:22)

试一试这对我有用How to put Google Maps V2 on a Fragment Using ViewPager

<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();

答案 1 :(得分:17)

您应该通过调用

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

MainActivity ,其中R.id.frag2_view是在main_layout中定义的布局。

要获得该片段,您应该调用

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

传递用于在main_layout中添加片段的布局 id

希望它有所帮助。

编辑:

由于您使用的是ViewPager,因此您应使用 R.id.pager 作为ID。 我只是尝试了你的例子而且它有效。

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

编辑2:

尽管它有效,但我并不认为这是正确的方法,因为R.id.pager来自ViewPager,你找不到,比方说, frag4 frag5

请忽略我的回答。我不确定如何使用ViewPager做到这一点,抱歉。

答案 2 :(得分:7)

我遇到了类似的问题,这是解决方案。 要获取viewpager中正确片段的引用,只需调用:

getSupportFragmentManager().findFragmentByTag(tag);  

您可以使用以下语法构建标记参数:"android:switcher:pager_id:index",其中pager_id是XML布局中ViewPager的ID,索引是ViewPager内部片段的位置1}}从零开始。请在此处查看原始回复:https://stackoverflow.com/a/7393477/2423274

答案 3 :(得分:2)

找到此问题的正确解决方案

希望更多人看到这一点。

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

您应该使用适配器(填充片段的位置)作为获取片段引用的源。

答案 4 :(得分: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);
        }