2017-09-13 11 views
1

MVP를 사용 중입니다. 내 활동에 단편이 하나 있습니다. 내가 초기화 오전 다음 Main-Activity 's Create 메서드 내에서 조각으로 프레 젠 테이션을 설정 다음과 같습니다.MVP (Android)의 프리젠터가 삭제되거나 내부에서 null이됩니다.

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); 
} 

내 mainFrgament 클래스 안에 setPresenterFunction의 Presenter를 다음과 같이 설정합니다.

public class MainFragment extends Fragment implements 
StashContract.PublishToView { 

public StashContract.ToPresenter forwardInteraction; 

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

mainFragment의 OnCreateView 안에 내 다음 코드와 같이 수행하는 검색 작업이, 내 앞으로에게 말하는 오류를 얻을 수 때로는 동안

"null 객체 참조에 인터페이스 메소드를 호출하는 시도" 언젠가 나는이 오류를 겪고 때로는 그렇지 않습니다. 이 조각의 "onCreateView"방법에서

@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; 
} 

답변

0

솔루션

을 일어나는 이유는 견해를 초기화, 이해가 안 돼요.

나머지 코드는 "onResume"메서드로 옮깁니다. 오류

확인 당신이 볼 수 있듯이 당신이 활동에서 "에서 onCreate"방법에있을 때, 당신의 조각 "onCreateView는"

enter image description here

라고이 이미지의

이유 .

코드의 현재 상태에서 발표자를 초기화하기 전에 사용하려고 할 때가 있습니다.

따라서 활동의 "onCreate"메소드에 표시된 것을 설정하고 조각의 "onStart"또는 "onResume"에 사용하십시오.

MVP 아키텍처에 대해 더 잘 이해하려면 project을 확인하십시오.

+0

mainActivity의 onCreate 메소드에서 발표자를 설정하고 onStart()에서 Presenter를 사용하여도 작동하지 않습니다. 한 가지 더 알아 두어야 할 점은 mainFrgament의 onResume() 메서드가 두 번 호출된다는 것입니다. –