2017-09-13 3 views
1

Ich benutze MVP. Meine Aktivität enthält ein Fragment. Ich initialisiere und setze den Moderator so, dass er wie folgt innerhalb der Main-Activity-Methode "Create" fragmentiert wird.Presenter in MVP (Android) wird gelöscht/bekommt null in Fragment

public class MainActivity extends AppCompatActivity { 

    private StashPresenter stashPresenter; 
    private MainFragment mainFragment; 
    FragmentManager fm; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    App.getInstance().getAppComponent().inject(this); 
    setContentView(R.layout.activity_main); 

    fm = getSupportFragmentManager(); 

    fm.beginTransaction() 
    .add(R.id.fragment_container, MainFragment.newInstance(),"mainFragment") 
    .commitNow(); 

    mainFragment = (MainFragment) fm.findFragmentById(R.id.fragment_container); 

    stashPresenter = new StashPresenter(mainFragment); 

    mainFragment.setPresenter(stashPresenter); 
} 

Inside my mainFrgament Klasse Ich bin settinf Presenter in setPresenterFunction wie folgt.

public class MainFragment extends Fragment implements 
StashContract.PublishToView { 

public StashContract.ToPresenter forwardInteraction; 

public void setPresenter(StashContract.ToPresenter forwardInteraction) 
{ 
    this.forwardInteraction = forwardInteraction; 
} 

Manchmal während der Durchführung Suchoperation wie in meinem folgenden Code innerhalb OnCreateView von mainFragment gezeigt, ich einen Fehler bekommt meine vorwärts sagen „Versuch, Interface-Methode auf ein Null-Objekt Verweis aufrufen“

Irgendwann bekomme ich diesen Fehler, manchmal nicht. Ich verstehe nicht, warum dies geschieht

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_main, container, false); 
    unbinder = ButterKnife.bind(this, view); 


    searchView.setOnEditorActionListener((v, actionId, event) -> { 
     if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
      progressBar.setVisibility(View.VISIBLE); 

      forwardInteraction.searchButtonClick(actionId, searchView.getText().toString()); 

      return true; 
     } 
     return false; 
    }); 


    String[] artistNames = getResources().getStringArray(R.array.artistNamesSuggestion); 
    ArrayAdapter<String> adapterArtist = new ArrayAdapter<>(getActivity().getApplicationContext(), R.layout.fragment_main, R.id.search_phrase, artistNames); 
    searchView.setAdapter(adapterArtist); 
    searchView.setThreshold(1); 

    recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3)); 
    recyclerView.setAdapter(adapter); 
    recyclerView.addItemDecoration(new SpaceItemDecoration(space, space, space, space)); 

    return view; 
} 

Antwort

0

Lösung

Im „onCreateView“ Methode des Fragments, initialisieren nur die Ansichten.

Verschieben Sie den Rest des Codes in der "OnResume" -Methode.

Grund für die Fehler

prüfen dieses Bild

enter image description here

Wie Sie sehen können, "onCreateView" des Fragments wird aufgerufen, wenn Sie in der "onCreate" -Methode in Sie Aktivität sind .

Im aktuellen Zustand Ihres Codes, gibt es vielleicht Zeiten, wenn Sie versuchen, den Präsentator zu verwenden, bevor es initialisiert wird.

Setzen Sie daher Ihre in der "onCreate" -Methode Ihrer Aktivität dar und verwenden Sie sie entweder auf "onStart" oder "onResume" Ihres Fragments.

Sie können diese project überprüfen, um die MVP-Architektur mehr zu verstehen.

+0

Es funktioniert nicht, auch nachdem Sie einen Presenter in der onCreate-Methode von mainActivity gesetzt haben und Presenter in onStart() verwendet haben. Noch eine Sache, die ich bemerkt habe, meine onResume() -Methode von MainFrgament zweimal aufgerufen werden. –

Verwandte Themen