Kri*_*ris 26 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;
}
Run Code Online (Sandbox Code Playgroud)
}
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);
}
}
Run Code Online (Sandbox Code Playgroud)
buttonClickListener.java
public interface buttonClickListener {
public void onButtonPressed(String msg);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
请告诉我哪里出错了?
编辑:我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
代码库保留在此处以供参考 https://skydrive.live.com/redir?resid=D37E0F56FEC9B499!259
小智 22
试一试这对我有用如何使用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();
Run Code Online (Sandbox Code Playgroud)
Edu*_*zer 18
您应该通过调用添加片段Frag2
getSupportFragmentManager().beginTransaction().add(R.id.frag2_view, new Frag2(), "tag").commit();
Run Code Online (Sandbox Code Playgroud)
在MainActivity中,R.id.frag2_viewmain_layout中定义的布局在哪里.
要获得那个片段,你应该打电话
Frag2 obj = (Frag2)getSupportFragmentManager().findFragmentById(R.id.frag2_view);
Run Code Online (Sandbox Code Playgroud)
传递用于在main_layout中添加片段的布局ID.
希望能帮助到你.
编辑:
由于您使用ViewPager,因此应使用R.id.pager作为ID.我只是尝试了你的例子并且它有效.
Frag2 fragmentObj=(Frag2) getSupportFragmentManager().findFragmentById(R.id.pager);
Run Code Online (Sandbox Code Playgroud)
编辑2:
尽管它有效,但我并不认为这是正确的方法,因为R.id.pager来自ViewPager,你找不到,比方说,frag4或frag5.
请忽略我的回答.对不起,我不确定如何使用ViewPager做到这一点.
我遇到了类似的问题,这是解决方案.要获取viewpager中正确片段的引用,只需调用:
getSupportFragmentManager().findFragmentByTag(tag);
Run Code Online (Sandbox Code Playgroud)
标签参数可以使用以下语法构建它:"android:switcher:pager_id:index",其中pager_id是XML布局中ViewPager的id,索引是片段在ViewPager零开始时的位置.请参阅此处的原始回复:https: //stackoverflow.com/a/7393477/2423274
为这个问题找到了正确的解决方案。
希望更多人看到这个。
Frag2 fragmentObj=(Frag2) mSectionsPagerAdapter.getItem(2);
Run Code Online (Sandbox Code Playgroud)
您应该使用您的适配器(在其中填充片段)作为获取片段引用的来源。
| 归档时间: |
|
| 查看次数: |
51384 次 |
| 最近记录: |