2016-09-26 2 views
0

Я пытаюсь передать простой String из @EActivity в @EFragment, поэтому я могу позже назначить это значение textView в @EFragment, я не хотите использовать экономию в расслоении рисункаКак передать данные из @EActivity в @EFragment и назначить для просмотра

Моя попытка:

@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

явно 'tv_fpd_description' равна нулю, прежде чем он вводится (я ставку на' onCreateView') ... onCreateView не вызывается до фрагмента добавляется в операцию ... – Selvin

+0

так, где я должен инициализировать его тогда –

+1

Наивное решение: проверьте, является ли view null в setme ... если он затем хранит данные somwhere и устанавливает его в @AfterViews фрагмента ... или использует setme после 'adapter.addFragment' – 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();