2016-06-18 232 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,這是正是由這一點。