2016-06-18 189 views
0

我试图从一个片段传值的活动,我可以,因为我得到也不例外之间传递数据。在我的片段中,我必须选择一个在FrameLayout中呈现的星座。 要做活动和片段之间的通信我正在使用回调。安卓片段和活动

唯一的例外是:

java.lang.NullPointerException: Attempt to invoke interface method 
'void 
com.converter.android.dailyhoroscope.HoroscopeChoice$OnInfoChangedListener.onInfoChanged(java.lang.String)' 
on a null object reference            
at 
com.converter.android.dailyhoroscope.HoroscopeChoice$1.onClick(HoroscopeChoice.java:133) 
at android.view.View.performClick(View.java:5204)      
at android.view.View$PerformClick.run(View.java:21153)     
at android.os.Handler.handleCallback(Handler.java:739)     
at android.os.Handler.dispatchMessage(Handler.java:95)     
at android.os.Looper.loop(Looper.java:148)        
at android.app.ActivityThread.main(ActivityThread.java:5417)   
at java.lang.reflect.Method.invoke(Native Method)      
at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

在片段,我有以下代码:

public class HoroscopeChoice extends DialogFragment { 
public HoroscopeChoice() { 
    } 
    /****************************** 
    * Callback 
    ********/ 
    public static void setOnInfoChangedListener(OnInfoChangedListener callback) { 
     mCallback = callback; 
    } 

    public interface OnInfoChangedListener { 
     public void onInfoChanged(String horosocopo); 

    } 
(...) 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_horoscope_choice, 
       container, false); 

     Button aquarius; 
     aquarius = (Button) view.findViewById(R.id.aquarius1); 

     final int id = view.getId(); 

     View.OnClickListener onClickListener = new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       String horoscopo = onClick2(v.getId()); 
       mCallback.onInfoChanged(horoscopo); 
      } 
     }; 

     aquarius.setOnClickListener(onClickListener); 
     return view; 
    } 

    public String onClick2(int id) 
    { 
     String horoscopo=""; 

     if (id == R.id.aquarius1) { 
      horoscopo = "Aquarius"; 
     } 
     (...) 
     return horoscope; 
    } 

上的活动,如果我试图把setOnInfoChangedListener(this);要解决的例外,我有,我收到另一个错误“无法解析方法setOnInfoChangedListener”。

活动:

public class SchedulerActivity extends Activity implements HoroscopeChoice.OnInfoChangedListener { 

(...) 
setOnInfoChangedListener(this); 

    public void onInfoChanged(String horoscopo) { 
     String sign=""; 
     mHoroscopeDisplay = (TextView) findViewById(R.id.dailyHoroscope4); 
     mHoroscopeDisplay.setText(horoscopo); 
     saveData(dHosocope, sign); 
    } 
} 

你能帮助我吗?

+0

我在这里有一个答案给你http://stackoverflow.com/questions/14247954/communicating-between-a-fragment-and-an-activity-best-practices/25392549#25392549 – Eenvincible

回答

0

在您的片段中添加以下代码。

@Override 
public void onAttach(Activity context){ 
    super.onAttach() 
    if(context instanceof OnInfoChangedListener) 
     listener=(OnInfoChangedListener)context; 
} 
+0

我可以”吨做到这一点,我得到红色@override“方法不重写方法从超类” – porthfind

+0

对不起,纠正我的答案。这是活动而不是上下文。 –

+0

如果我写我的活动每次我试图去碎片时间得到异常: 致命异常:主要 过程:com.converter.android.dailyhoroscope,PID:30989 android.util.SuperNotCalledException:片段HoroscopeChoice {6b9709 #0占星}没有通过super.onAttach()调用 – porthfind

0

您获得的接口实例为空。如果您想从Fragment调用接口方法,请在“作业”中创建接口并将其实施到接口方法

  1. 创建接口并在活动中实施它。 (你已经这样做了)
  2. 在片段创建接口实例。

    public class MyFragment extends Fragment{ 
        private onInfoChangedListener listener; 
    
        //you have to instantiate the listener variable in onAttach() 
        @Override 
        public void onAttach(Context context){ 
         super.onAttach(); 
         try{ 
         listener=(SchedulerActivity)context; 
         }catch(Throwable e){ 
         //interface might not be implemented 
         } 
        } 
    
        //now you can use this in the onCreateView() method 
        public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ 
         aquarius.setOnClickListener(new View.OnCLickListener{ 
          @Override 
          public void onClick(View v){ 
           try{ 
            listener.onInfoChanged(horoscopo); 
           }catch(Throwable e){ 
            //listener can be null 
           } 
          } 
         }); 
    } 
    
0

嗯,你可能需要的接口是如何工作的提醒;)

片段:

public class MyFragment extends Fragment { 
    private OnInfoChangedListener listener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     this.listener = null; 
     return inflater.inflate(R.layout.fragment_layout, container, false); 
    } 

    void aFunctionWhereSomethingHappen(){ 
     // fire event 
     if(listener!=null) 
      listener.onInfoChanged("text"); 
    } 

    public interface OnInfoChangedListener { 
     void onInfoChanged(String horosocopo); 
    } 

    public void setOnInfoChangedListener(OnInfoChangedListener listener) { 
     this.listener = listener; 
    } 
} 

在你的活动:

MyFragment fragment = new MyFragment(); 
fragment.setOnInfoChangedListener(new MyFragment.OnInfoChangedListener() { 
    @Override 
    public void onInfoChanged(String horosocopo) { 
     // event 
    } 
}); 

我希望它更清晰 !

编辑:

您可能还需要考虑使用库,例如​​EventBusOtto,这是正是由这一点。