2012-05-09 3 views
1

저는 android.SHortly의 begginner입니다. 제가하고있는 일은 simpleAdapater를 사용하여 연습용 웹 URL 목록을 표시하는 것입니다. 그러나 URL을 클릭하면 강제 종료 오류가 발생합니다. 불행하게도URL을 클릭하면 SimpleAdapter를 사용할 때 ListView에서 강제 종료 오류가 발생합니다.

intent.addFlag(FLAG_ACTIVITY_NEW_TASK); 

: 로그 캣 내가 이미 startActivity를 method.for 예를 호출하기 전에이 플래그를 추가한다 exception.one 가능한 솔루션의 종류에 대한 몇 가지 비슷한 문제를 발견

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

보여줍니다 웹 URL의 클릭 이벤트는 시스템에 의해 자동으로 응답됩니다. 내 경우이 문제를 어떻게 해결할 수 있습니까? 그리고 SimpleAdapter를 사용하지만 ArrrayAdapter를 사용하지 않을 때 왜이 문제가 발생했는지 설명 할 수 있습니까? 여기
public class RSSContentActivity extends ListActivity 
{ 
private SimpleAdapter simpleAdapter; 
private ListView  lv; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 


    lv = getListView(); 
    simpleAdapter = new SimpleAdapter(getApplicationContext(), getData(), 
      R.layout.rss_content_item, new String[] 
      {"item_link" }, new int[] 
      {R.id.rss_item_content}); 
    lv.setAdapter(simpleAdapter); 

} 

private List<Map<String, Object>> getData() 
{ 

    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 

    Map<String, Object> map = new HashMap<String, Object>(); 
     map.put("item_link", 
      "http://www.bom.gov.au/vic/warnings/coastalwind.shtml"); 
    list.add(map); 

    map = new HashMap<String, Object>(); 
    map.put("item_link", 
      "http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDV36050.html"); 
    list.add(map); 

    map = new HashMap<String, Object>(); 
     map.put("item_link", "http://www.bom.gov.au/products/IDY21000.shtml"); 
    list.add(map); 

    return list; 
} 
} 

가 rss_item_content.xml 파일입니다 : 여기

메인 코드 결국

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rss_item_content" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:autoLink="web" 
android:padding="10dp" 
android:textAppearance="?android:attr/textAppearanceMedium" > 
</TextView> 
+0

어떤 몸이 나를 도울 수 있습니까? –

답변

1

, 나는 스스로 했었어 생각하여이 문제가 아니라 시스템을 요구하다 해결 링크를 처리하려면 전체 프로세스를 수동으로 수행하십시오. 여기 는 솔루션입니다 :

첫째, 레이아웃 파일에 자동 링크 속성을 삭제하는 것은

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/rss_item_content" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:padding="10dp" 
android:textAppearance="?android:attr/textAppearanceMedium" > 
</TextView> 

다음 SimpleAdapter에서 상속 adapater를 구현하고,에 링크 텍스트를 변경할 수의 getView 방법을 다시 작성 클릭 이벤트와 웹 링크의 겉 모양과 거래를 수동으로

public class RSSContentAdapter extends SimpleAdapter 
{ 
    private Context context; 
public RSSContentAdapter(Context context, List<? extends Map<String, ?>> data, int resource,String[] from, int[] to) 
{ 
    super(context, data, resource, from, to); 
    this.context=context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View view = super.getView(position, convertView, parent); 

    if (view != null) 
    { 
     TextView link = (TextView) view.findViewById(R.id.rss_item_content); 
     if (link != null) 
     { 
      String linkText = link.getText().toString(); 
      SpannableString sp = new SpannableString(linkText); 

      // set the link text to a link appearance and rewrite the onClick method 
      sp.setSpan(new URLSpan(linkText){ 
       @Override 
       public void onClick(View widget) 
       {      
        //linkText 
        String linkText=((TextView)widget).getText().toString(); 

        Log.d(getClass().toString(), "onClick"); 

        //send URL to web browser 
        Uri uri = Uri.parse(linkText); 
        Intent it = new Intent(Intent.ACTION_VIEW,uri); 

        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//add the flag to avoid force close error 

        context.startActivity(it); 

       } 

      }, 0, linkText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

      link.setText(sp); 

      MovementMethod m = link.getMovementMethod(); 
      if ((m == null) || !(m instanceof LinkMovementMethod)) 
      { 
       if (link.getLinksClickable()) 
       { 
        link.setMovementMethod(LinkMovementMethod.getInstance()); 
       } 
      } 
     } 
    } 
    return view; 
} 

}

마지막 단계는 매우 simple.Just입니다 액티비티에서이 새 애님을 사용하십시오.

lv = getListView(); 
listAdapter = new 
RSSContentAdapter(getApplicationContext(), getData(), 
    R.layout.rss_content_item, new String[] { "item_link" }, new int[] { 
    R.id.rss_item_content }); 
lv.setAdapter(listAdapter); 

그러나이 문제가 발생한 이유는 여전히 궁금합니다. 누구든지 아이디어가 있습니까?

0

시도 :

simpleAdapter = new SimpleAdapter(this, ... 

getApplicationContext() -> this 
+0

설명을 제공해 주시겠습니까? 현재 귀하의 대답은 불완전합니다. – bjb568

관련 문제