2015-07-15 2 views
5

Я использую Android Studio, которая реализует все функции класса фрагмента. Я получаю следующее исключение среды выполнения:Как добавить фрагмент в свою активность динамически?

must implement OnFragmentInteractionListener 

Вот мой код, и я реализовал OnFragmentInteractionListener в моей основной деятельности.

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (findViewById(R.id.fragment_container) != null) { 
      BlankFragment fragment = new BlankFragment(); 
      android.support.v4.app.FragmentManager manager = getSupportFragmentManager(); 
      android.support.v4.app.FragmentTransaction ft = manager.beginTransaction(); 
      ft.add(R.id.fragment_container, fragment).commit(); 
     } 
    @Override    
    public void onFragmentInteraction(Uri uri) {} 

} 

BLANK ФРАГМЕНТ:

public class BlankFragment extends android.support.v4.app.Fragment { 
    private OnFragmentInteractionListener mListener; 
    public interface OnFragmentInteractionListener { 
     public void onFragmentInteraction(Uri uri); 
    } 

    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 
} 

Остальные методы класса фрагмента и основной деятельности также осуществляются по умолчанию. Я также изменил LinearLayout с FrameLayout в main_activity.xml file and also assigned android: id` к нему, на который делается ссылка. Что не так с моим кодом?

+0

Вы инициализировали «mListener» объект интерфейса с активностью? – user007

+0

Вы используете android.support.v4.app.Fragment как базовый класс в BlankFragment или android.app.Fragment? – lal

+0

Ваш код не ясен. Пожалуйста, повторите два класса (активность и фрагмент) – GVillani82

ответ

1

Для взаимодействия с BlankFragment объекта, я хотел бы использовать следующий метод, рекомендованный в Android Support Docs - Я считаю, что это то, что вы пытаетесь достичь, и это будет подходящим, как ваш BlankFragment объект размещается MainActivity:

public class MainActivity extends FragmentActivity implements BlankFragment.OnFragmentInteractionListener { 

private BlankFragment fragment = null; 
private android.support.v4.app.FragmentManager manager = null; 
private android.support.v4.app.FragmentTransaction ft; 

public void onFragmentInteraction(Uri uri){ 
     Log.i("Tag", "onFragmentInteraction called"); 
    } 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (manager == null) manager = getSupportFragmentManager();    

    if(manager.findFragmentById(R.id.fragment_container) == null) { 

     //If a fragment is not already loaded into your container, then add one... 

     fragment = new BlankFragment(); 
     ft= manager.beginTransaction(); 
     ft.add(R.id.fragment_container,fragment).commit(); 
    } 
} 

для того, чтобы связаться с вашим фрагментом, вы могли бы сделать следующее:

if(fragment == null) { 
    fragment = (BlankFragment) manager.findFragmentById(R.id.fragment_container); 
} 

вы можете вызывать любые методы, связанные с fragment

Если это наоборот (сообщение от фрагмента к деятельности), то вам нужно будет сделать следующее в BlankFragment, чтобы сформировать связь с родителем Activity:

//Class variable... 
OnFragmentInteractionListener mCallback; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mCallback = (OnFragmentInteractionListener) activity; 
      } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
     } 
    } 

Возможно, вы забыли об этом последний шаг, который может объяснить вашу ошибку. Затем вы должны использовать:

mCallback.onFragmentInteraction(uri); 

Для связи с MainActivity

+0

Я только что начал java неделю назад. и я, конечно, не понимаю много кода в пустой активности. Я просто хочу показать текстовое поле, которое находится в макете фрагмента. этот код реализуется по умолчанию в студии android. public void onButtonPressed (Uri uri) { если (mListener! = Null) { mListener.onFragmentInteraction (uri); } } нет кнопки, прикрепленной к фрагменту.xml. Я не понимаю эту автогенерированную часть. – user3859323

+0

@ user3859323 Был ли это образец проекта, созданного Android Studio? Если да, то как вы его создали? Я продублирую его до конца и посмотрю. – PPartisan

+0

Нет, это не образец проекта. когда я нажимаю на свое приложение и добавляю фрагмент, я выбрал blankFragment, и он сгенерировал его java и xml. Создайте проект и добавьте пустой фрагмент в свою деятельность, что я и делал. – user3859323

0

Это работает для меня, я просто поделился ею здесь вы никогда не знаете, что это будет помогать кто-то еще.

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit(); 

Всего одна строка кода.

Смежные вопросы