2016-09-26 63 views
0

我試圖將簡單的String從@EActivity傳遞到@EFragment,所以我可以稍後將該值分配給@Fragment中的textView,我不想在捆綁模式使用節能如何將數據從@EActivity傳遞給@Fragment並分配到視圖

我嘗試:

@EActivity(R.layout.activity_pre_plan_detail) 
public class PrePlanDetailActivity extends AppCompatActivity { 
    // some long adapter code 

    @AfterViews 
    void inits_(){ 
     adapter.addFragment(myFragment_.builder().build().setme("something")); 
    } 
} 
______________________________________________________________________________ 

@EFragment(R.layout.fragment1) 
public class PlanDescription extends Fragment { 

    @ViewById 
    TextView tv_fpd_description; 


    public void setme(String data){ 
     tv_fpd_description.setText(data); 
    } 

} 

輸出/錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 

注:提到的所有註解樣板庫的一部分[android annotation][1]

+0

顯然之前被注入(我打賭'onCreateView')... onCreateView不叫之前片段加入到活動...... – Selvin

+0

所以我應該在哪裏初始化它,然後 –

+1

天真的'tv_fpd_description'爲空:檢查視圖在setme中是否爲空...如果它然後存儲數據somwhere並將其設置在片段的@AfterViews中...或在adapter.addFragment後面使用setme – Selvin

回答

1
Try with local broadcast manager 
**Activity code:** 
----------------- 
Intent intent = new Intent("my-custom-event"); 
     intent.putExtra("message", "something"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

**fragment code:** 
------------------- 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onReceiver , new IntentFilter("my-custom-event")); 
    } 
@Override 
    public void onDestroy() { 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onReceiver); 
     super.onDestroy(); 
    } 
**BroadCastReceiver:** 

private BroadcastReceiver onReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String data= intent.getStringExtra("message"); 
      tv_fpd_description.setText(data); 
     } 
    }; 
+0

其不錯,策略,但我更喜歡使用AA –

0

你真的應該使用這個Fragment說法:

@EFragment(R.layout.fragment1) 
public class PlanDescription extends Fragment { 

    @FragmentArg 
    String someDescription; 

    @ViewById 
    TextView tv_fpd_description; 

    @AfterViews 
    void afterViews() { 
     tv_fpd_description.setText(someDescription); 
    } 
} 

而且你可以創建Fragment是這樣的:

PlanDescription_.builder(). 
    someDescription("your data") 
    .build(); 
相關問題