当前位置: 首页 > 知识库问答 >
问题:

getSupportFragmentManager()。findFragmentById()返回null

厍浩广
2023-03-14

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

但是我的应用程序由于getSupportFragmentManager()而崩溃。findFragmentById()返回null。我的实现有什么问题。

代码如下:

该程序只是通过从第一个fragmnet单击按钮,将一个片段的输入文本发送到另一个片段textView区域。我有一个activity\u main。xml和两段式布局(两个单独的xml文件,而不是activity\u 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插件eclipse IDE生成的模板创建片段。所以片段是使用android.support.v4.app.片段创建的

@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

共有3个答案

贺山
2023-03-14

我遇到了一个类似的问题,下面是解决方法。要获取对viewpager中正确片段的引用,只需调用:

getSupportFragmentManager().findFragmentByTag(tag);  

您可以使用以下语法构建标记参数:“android:switcher:pager\u id:index”,其中,pager\u id是XML布局中的ViewPager的id,索引是您的片段在ViewPager中的位置,从零开始。请参见此处的原始响应:https://stackoverflow.com/a/7393477/2423274

钮轩昂
2023-03-14

您应该通过调用

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

在MainActivity中,其中R.id.frag2\u视图是在main\u布局中定义的布局。

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

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

传递用于在main\u布局中添加片段的布局id。

希望有帮助。

编辑:

由于您使用ViewPager,因此您应该使用R.id.pager作为ID。我刚刚尝试了您的示例,并且成功了。

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

编辑2:

尽管它有效,但我并不认为这是正确的方法,因为R.id.pager是从ViewPager中找到的,你无法找到frag4或frag5。

请忽略我的回答。对不起,我不知道如何使用ViewPager实现这一点。

宰父霖
2023-03-14

试试这个我觉得很好如何使用ViewPager将Google Maps 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();
 类似资料:
  • 我尝试在我的MainActivity上使用google map功能,我有一个空指针返回:getsupportfragmentmanager().findFragmentById(r.id.map);==>返回null mapfragment将为null,当我使用getMapAsync(this)调用它时;应用程序在启动前就关闭了 content_main.xml 以下是文件: 映射片段位于cont

  • mainactivity.java 问题是,当我调用时,我得到的是空值,但当我调用时,我得到的是片段。

  • 我对Google Maps有一个问题,即getSupportFragmentManager().findFragmentById返回的总是null。你有办法解决这个吗? 代码如下: mapsFragment.java: 我有Google Maps在活动,它与代码一起工作: null 你知道我怎么解决这个问题吗?

  • 问题内容: 例如我有一个功能: 我怎样才能返回AJAX后得到的? 问题答案: 因为请求是异步的,所以您无法返回ajax请求的结果(而同步ajax请求是一个 糟糕的 主意)。 最好的选择是将自己的回调传递给f1 然后,您将像这样致电:

  • 我按照这个教程:https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer 现在我在这一点上: 我的问题是这条线... 显示一个错误:不兼容的类型。需要android。应用程序。FragmentManager发现:android。支持v4.app。碎片管理器。 我看到了一些帖子,但它们不适合我。 我用AppC

  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null