2013-10-02 3 views
0

У меня есть Основное действие. в основной деятельности, в Oncreat {}, я создающий фрагмент с именем «Channellist» Кодом:Необходимо реализовать интерфейс при реализации этого интерфейса в действии

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //initVtcId(); 
    setContentView(R.layout.activity_main); 
    FragmentManager fm = getSupportFragmentManager(); 

    if (fm.findFragmentById(android.R.id.tabcontent) == null) { 

      FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
      ChannelList list = new ChannelList(); 
      //fragmentTransaction.add(android.R.id.content, list); 

      fragmentTransaction.add(android.R.id.tabcontent, list); 
      fragmentTransaction.commit(); 
     } 

Для Одере Channellist общаться до активности с именем «ChannelActivity». Я использую интерфейс с именем «OnListItemSelectedListener» и его метод «onListItemSelected» в Channellist

public class ChannelList extends ListFragment { 
private OnListItemSelectedListener mCallback; 
public interface OnListItemSelectedListener { 
    public void onListItemSelected(ListView l, int position); 
} 

Обломок Channellist фиксирует реализацию интерфейса во время его onAttach) метод жизненного цикла (

 @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception. 
     try { 
      mCallback = (OnListItemSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnListItemSelectedListener"); 
     } 
    } 

следующий метод в фрагмент вызывается, когда пользователь нажимает на элемент списка. Фрагмент использует интерфейс обратного вызова для доставки события родительской активности.

public void onListItemClick(ListView l, View v, int position, long id) { 
    mCallback.onListItemSelected(l, mChannelAdapter.getItem(position) 
      .getID()); 
} 

На ChannelActivity я реализую этот интерфейс и его метод для вызова фрагмента с именем «ChannelDetailFragment»

public class ChannelActivity extends FragmentActivity implements 
    ChannelList.OnListItemSelectedListener { 

private FragmentManager fm; 
private Fragment mChannelDetailFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.channel_activity); 
    fm = getSupportFragmentManager(); 

    Fragment mChannelListFragment = fm 
      .findFragmentByTag(ChannelList.TAG); 
    if (mChannelListFragment == null) { 
     addFragment(new ChannelList(), false, 
       ChannelList.TAG); 
    } 

} 

@Override 
public void onListItemSelected(ListView l, int position) { 
    Bundle args = new Bundle(); 
    args.putInt(ChannelDetailFragment.CHANNEL_ID, position); 

    mChannelDetailFragment = fm 
      .findFragmentByTag(ChannelDetailFragment.TAG); 
    if (mChannelDetailFragment == null) { 
     mChannelDetailFragment = new ChannelDetailFragment(); 
    } 
    mChannelDetailFragment.setArguments(args); 
    addFragment(mChannelDetailFragment, true, ChannelDetailFragment.TAG); 
} 

Я следовать этому TUT по адресу: http://developer.android.com/training/basics/fragments/communicating.html#Deliver К сожалению, у меня есть бросок ошибки из OnAttach {}. Я много раз проверял свой код, но не обнаружил, где это неверно. Сб помогите мне!

10-02 14:07:40.156: E/AndroidRuntime(980): FATAL EXCEPTION: main 
10-02 14:07:40.156: E/AndroidRuntime(980): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.channellistfragment/com.example.channellistfragment.MainActivity}: java.lang.ClassCastException: [email protected] must implement OnListItemSelectedListener 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.os.Looper.loop(Looper.java:137) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-02 14:07:40.156: E/AndroidRuntime(980): at java.lang.reflect.Method.invokeNative(Native Method) 
10-02 14:07:40.156: E/AndroidRuntime(980): at java.lang.reflect.Method.invoke(Method.java:511) 
10-02 14:07:40.156: E/AndroidRuntime(980): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-02 14:07:40.156: E/AndroidRuntime(980): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-02 14:07:40.156: E/AndroidRuntime(980): at dalvik.system.NativeStart.main(Native Method) 
10-02 14:07:40.156: E/AndroidRuntime(980): Caused by: java.lang.ClassCastException: [email protected] must implement OnListItemSelectedListener 
10-02 14:07:40.156: E/AndroidRuntime(980): at com.example.channellistfragment.ChannelList.onAttach(ChannelList.java:79) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:867) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.Activity.performStart(Activity.java:5018) 
10-02 14:07:40.156: E/AndroidRuntime(980): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032) 
10-02 14:07:40.156: E/AndroidRuntime(980): ... 11 more 
+0

спасибо! Я понимаю, почему он не работает. – Tungken

ответ

0

У вас есть 2 действия и добавьте фрагмент ChannelList к обоим. Первый (основная активность) не реализует ваш интерфейс обратного вызова, и вы получаете ClassCast exeption.

+0

Спасибо! я удалил активность канала и реализовал интерфейс на mainactivity. Так что это нормально! Моя цель по-прежнему использует интерфейс реализации channelactivity, но не реализует интерфейс по mainactivity. – Tungken

+0

Нет смысла. Вы добавляете фрагменты в mainactivity, поэтому он должен иметь OnListItemSelectedListener, реализованный каким-то образом. Зачем вам нужна вторая активность? – Leonidos

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