GetSupportFragmentManager (). FindFragmentById () возвращает null

Я пытаюсь реализовать связь фрагментов в android, как в руководстве по android http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

Но мое приложение разбивается как getSupportFragmentManager (). FindFragmentById () возвращает null. В чем проблема с моей реализацией.

Код приведен ниже:

Программа предназначена только для отправки входного текста из одного фрагмента в другой фрагмент 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); } 

Скажите, пожалуйста, где я ошибся?

EDIT: Я использую создание фрагментов с использованием шаблона, созданного платформой 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

Solutions Collecting From Web of "GetSupportFragmentManager (). FindFragmentById () возвращает null"

Вы должны добавить фрагмент 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.

Надеюсь, поможет.

РЕДАКТИРОВАТЬ:

Поскольку вы используете ViewPager, вы должны использовать R.id.pager в качестве идентификатора. Я просто попытался с вашим примером, и это сработало.

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

EDIT 2:

Несмотря на это, я действительно не думаю, что это правильный путь, поскольку R.id.pager его из ViewPager и вы не можете найти, скажем, frag4 или frag5 .

Игнорируйте мой ответ, пожалуйста. Я не уверен, как это сделать с ViewPager, извините.

Попробуйте Это работает для меня Как разместить Google Maps V2 на фрагменте с помощью 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(); 

У меня была аналогичная проблема, и вот решение. Чтобы получить ссылку на правильный фрагмент внутри viewpager, просто вызовите:

 getSupportFragmentManager().findFragmentByTag(tag); 

Параметр тега вы можете построить с помощью следующего синтаксиса: "android:switcher:pager_id:index" , где pager_id – это идентификатор ViewPager в макете XML, а индекс – это положение вашего фрагмента внутри ViewPager начинающегося с нуля. См. Оригинальный ответ здесь: https://stackoverflow.com/a/7393477/2423274

Я использовал это, чтобы получить дочерний фрагмент из адаптера фрагмента …

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