활동 컨텍스트 외부에서 startActivity () 호출 OnClickListener. 의

ListView내 Android 응용 프로그램에서을 구현했습니다 . ListView클래스의 커스텀 서브 클래스를 사용하여 이것에 바인딩합니다 ArrayAdapter. 재정의 된 ArrayAdapter.getView(...)메서드 내에서을 할당합니다 OnClickListener. 의 onClick방법 OnClickListener에서 새로운 활동을 시작하고 싶습니다. 나는 예외를 얻는다 :

Calling startActivity() from outside of an Activity  context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

(현재 )가 작동 하고 Context있다는 것을 어떻게 알 수 있습니까?ListViewActivity



답변

어느 한 쪽

  • 어댑터의 생성자를 통해 Context 객체를 캐시하거나
  • 당신의 관점에서 그것을 얻을.

또는 최후의 수단으로

  • FLAG_ACTIVITY_NEW_TASK 플래그를 의도에 추가하십시오.

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

편집-이벤트 및 기록 스택의 정상적인 흐름을 방해하므로 플래그 설정을 피하십시오.


답변

대신 addFlags를 사용 하여 달성 할 수 있습니다.setFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

설명서 에 따르면 다음과 같습니다.

의도에 (또는 기존 플래그 값으로) 추가 플래그를 추가하십시오.


편집하다

Alex Volovoy의 답변에서 알 수 있듯이 기록 스택을 변경하는 플래그를 사용하고 있는지 확인하십시오 .

… 이벤트 및 히스토리 스택의 정상적인 흐름을 방해하므로 플래그를 설정하지 마십시오.


답변

사용하는 대신 (getApplicationContext)사용YourActivity.this


답변

아래와 같이 create chooser를 사용하여 오류가 발생한 경우 :

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));
startActivity(Intent.createChooser(sharingIntent, "Open With"));

다음과 같이 선택기를 작성하도록 플래그를 설정하십시오.

Intent sharingIntent = new Intent(Intent.ACTION_VIEW);
sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setData(Uri.parse("http://google.com"));

Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(chooserIntent);


답변

또한 : fragment의 listview에 링크를 표시하는 경우 다음 과 같이 만들지 마십시오

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);

대신에 전화

adapter = new ListAdapter(getActivity(),mStrings);

어댑터는 두 경우 모두 잘 작동하지만 링크는 마지막 경우에만 작동합니다.


답변

아마도 잘못된 위치에 OnClickListener를 구현하고 있다고 생각합니다. 보통 Activity에서 OnItemClickListener를 구현하고 대신 ListView에 설정해야합니다. 그렇지 않으면 이벤트에 문제가 발생합니다 …


답변

CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

또는

Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

아래로 변경

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);