2013-02-13 85 views
5

我已經通過各種方法,使這個項目的工作,並最終落戶從綠色機器人的EventBus。我在這裏的第二個問題在這裏: - Multiple Fragment to Activity communication空指針異常與碎片和EventBus

我被引導到那裏的活動巴士路線。我已經在適當的圖書館中狂奔,我認爲我非常接近它的工作。我不斷收到一個空指針例外,無論哪行包含

eBus.post(Str); 

我相當確定它,因爲我沒有正確註冊eBus。我知道Fragment沒有這樣的上下文,但我也嘗試使用getActivity()以及無效。我已經發布了下面的MainActivity,CoreFragment和LogCat。如果任何人都可以幫助,我將不勝感激。這一直在持續,近乎一個月的開啓和關閉!

import de.greenrobot.event.EventBus; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

EditText editText1; 
String Txt; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    editText1 = (EditText) findViewById(R.id.editText1); 
    Txt = ""; 
    EventBus eBus = new EventBus(); 
    eBus.register(this);<--This I removed. 
     eBus.getDefault().register(this);<--This is the new line you suggested 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void onEvent(String event){ 
    Txt = Txt + event; 
    editText1.setText(Txt);<--Left this as it was,it worked 
} 


}//End 

這裏是片段代碼:

import de.greenrobot.event.EventBus; 
import android.app.Activity; 
import android.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.RelativeLayout; 
import android.view.View.OnClickListener; 


public class CoreFragment extends Fragment{ 

int index; 
Button Button1,Button2,Button3; 
String Str,data; 
EventBus eBus; 


@Override 
public void onAttach(Activity a) { 
    super.onAttach(a); 
    EventBus eBus = new EventBus(); 
    eBus.getDefault().register(this); 
    } 


public static CoreFragment newInstance(int index) { 
    CoreFragment coreFragment = new CoreFragment(); 
    coreFragment.index = index; 
    return coreFragment; 
} 

public void onEvent(String event){ 
// Crash Stopper 
    } 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 


    if (container == null) { 
     // We have different layouts, and in one of them this 
     // fragment's containing frame doesn't exist. The fragment 
     // may still be created from its saved state, but there is 
     // no reason to try to create its view hierarchy because it 
     // won't be displayed. Note this is not needed -- we could 
     // just run the code below, where we would create and return 
     // the view hierarchy; it would just never be used. 
     return null; 
    } 
    RelativeLayout mRelativeLayout = (RelativeLayout) inflater.inflate(R.layout.corefragment, 
      container, false); 

    Button Button1 = (Button) mRelativeLayout.findViewById(R.id.Button1); 
    Button Button2 = (Button) mRelativeLayout.findViewById(R.id.Button2); 
    Button Button3 = (Button) mRelativeLayout.findViewById(R.id.Button3); 

    Button1.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    Str = "I "; 
    eBus.post(Str);<--Old code, removed in working version 
     eBus.getDefault().post(Str);<--Changed as suggested 
    } 

     }); 

    Button2.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Str = "want "; 
    eBus.post(Str);<--Old code, removed in working version 
     eBus.getDefault().post(Str);<--Changed as suggested 
    } 

     }); 

    Button3.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Str = "more "; 
    eBus.post(Str);<--Old code, removed in working version 
     eBus.getDefault().post(Str);<--Changed as suggested 
    } 

     }); 

    return mRelativeLayout; 
} 


}//end 

我曾嘗試過各種置換,如eBus.register(這);, eBus.register(此,String.Class);, EBUS。寄存器(getActivity());等 這裏是當按下按鈕1的logcat的: -

02-13 13:56:40.717: W/dalvikvm(26237): threadid=1: thread exiting with uncaught exception (group=0x40acf228) 
02-13 13:56:40.747: E/AndroidRuntime(26237): FATAL EXCEPTION: main 
02-13 13:56:40.747: E/AndroidRuntime(26237): java.lang.NullPointerException 
02-13 13:56:40.747: E/AndroidRuntime(26237): at com.epsilonitsystems.fragger.CoreFragment$1.onClick(CoreFragment.java:65) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.view.View.performClick(View.java:3549) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.view.View$PerformClick.run(View.java:14393) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.os.Handler.handleCallback(Handler.java:605) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.os.Looper.loop(Looper.java:154) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at android.app.ActivityThread.main(ActivityThread.java:4945) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at java.lang.reflect.Method.invoke(Method.java:511) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
02-13 13:56:40.747: E/AndroidRuntime(26237): at dalvik.system.NativeStart.main(Native Method) 

所有不同的我已經試過的方法編譯罰款,沒有錯誤,但強制關閉過一次,我按在屏幕上的按鈕。 任何人的想法請任何想法?謝謝。

回答

21

嘗試按以下建議:

1.任何你正在註冊的事件總線使用:

EventBus.getDefault().register(this); 

2.當你想發佈事件的使用:

EventBus.getDetault().post(new MyEvent(aString)); 

3 。如果您要更改UI,請務必按以下方式命名事件方法:

public void onEventMainThread(MyEvent event){ 
     editText1.setText(event.getString()); 
    } 

4.定義事件類來保存結果:

public class MyEvent(){ 
    private mString; 

    public MyEvent(String string){ 
    mString = string; 
    } 

    public getString(){ 
    return mString; 
    } 
} 

5.不要忘記調用註銷從EventBus你的組件:

EventBus.getDefault().unregister(this); 
+1

馬可,你是超級明星!櫻桃選擇了適合我的要求的答案,但你已經解決了這個問題!如果我有足夠的聲望點,我會標出你的答案,對不起。非常感謝你!!! – Gary 2013-02-14 14:44:14

+0

對於任何人試圖解決他們自己的問題,在非工作和工作代碼的差異被標記。 – Gary 2013-02-14 16:24:50

+0

爲什麼我得到_Subscriber類沒有公共方法調用onEvent_錯誤? – 2014-07-24 05:56:02

1

你不必申報
EventBus eBus =新的EventBus();在您的代碼中。

你只需撥打EventBus.getDefault()。register(this);