我正在尝试在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
我遇到了一个类似的问题,下面是解决方法。要获取对viewpager中正确片段的引用,只需调用:
getSupportFragmentManager().findFragmentByTag(tag);
您可以使用以下语法构建标记参数:“android:switcher:pager\u id:index”
,其中,pager\u id是XML布局中的ViewPager的id,索引是您的片段在ViewPager中的位置,从零开始。请参见此处的原始响应:https://stackoverflow.com/a/7393477/2423274
您应该通过调用
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实现这一点。
试试这个我觉得很好如何使用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