2013-02-13 13 views
5

私はこのプロジェクトを動作させるために様々な方法を行っており、最終的にはグリーンロボットからEventBusに落ち着いています。これに関する私の2番目の質問はここにあります: - Multiple Fragment to Activity communicationフラグメントとイベントバスのnullポインタ例外

イベントバスのルートをそこに誘導しました。私は彼が適切な図書館で動かしていて、私はそれを機能させることに非常に近いと思う。

eBus.post(Str); 

私はeBusを正しく登録していないので、私はかなり確信しています。私はフラグメントがそのようなコンテキストを持っていないことを知っていますが、getActivity()も無駄に使用しようとしました。 MainActivity、CoreFragment、LogCatを下記に掲載しました。もし誰かが助けることができれば、私はそれを高く評価します。これは、ほぼ1ヶ月間、オンとオフに進行中です!ここ

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 

Iは、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

次の提案を試してみてください:あなたは、イベントの使用を投稿したい場合は

EventBus.getDefault().register(this); 

2:

1. Anywhereのイベント・バスの使用に登録されている

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

Marco、あなたはSuperStarです!私の桜は私の要求に合うようにあなたの答えのビットを選んだが、あなたは問題を解決した!私が十分な評判のポイントを持っていれば、私はあなたの答えをマークアップするだろう、申し訳ありません。どうもありがとうございました!!! – Gary

+0

自分の問題を解決しようとする人には、非作業コードと作業コードの違いが顕著です。 – Gary

+0

なぜ_SubscriberクラスにはonEvent_エラーと呼ばれるパブリックメソッドがありませんか? –

1


を宣言する必要がEventBus eBus =新しいEventBus();あなたのコードに

EventBus.getDefault()。register(this);