【问题标题】:Using Linkify in ListView's ArrayAdapter causes RuntimeException在 ListView 的 ArrayAdapter 中使用 Linkify 会导致 RuntimeException
【发布时间】:2012-08-02 18:45:58
【问题描述】:

我的ArrayAdapter 中有一个TextView,其中可能包含一些超链接。对于那些我使用Linkify的链接:

public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    if (rowView == null) {
        rowView = inflater.inflate(R.layout.list_item_2, null);
        holder = new ViewHolder();

        holder.content = (TextView) rowView.findViewById(R.id.postContent);
        holder.date = (TextView) rowView.findViewById(R.id.postDate);

        rowView.setTag(holder);
    } else {
        holder = (ViewHolder) rowView.getTag();
    }

    holder.content.setText(contents.get(position));
    holder.date.setText(dates.get(position));

    Linkify.addLinks(holder.content, Linkify.ALL);

    return rowView;
}

但是因为 Linkify 被添加到了 ArrayAdapter 中,我得到一个异常说:

08-05 16:42:16.715: E/AndroidRuntime(20598): FATAL EXCEPTION: main
08-05 16:42:16.715: E/AndroidRuntime(20598): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
08-05 16:42:16.715: E/AndroidRuntime(20598):    at android.app.ContextImpl.startActivity(ContextImpl.java:921)
08-05 16:42:16.715: E/AndroidRuntime(20598):    at android.content.ContextWrapper.startActivity(ContextWrapper.java:283)
08-05 16:42:16.715: E/AndroidRuntime(20598):    at android.text.style.URLSpan.onClick(URLSpan.java:62)

我怎样才能做到这一点?我想不出替代方案。

【问题讨论】:

  • 您确定这就是您在 logcat 中找到的全部内容吗?在我看来,还有一些例外情况可能包含有价值的信息。
  • 不,这是关于在活动上下文(ArrayAdapter)之外运行活动

标签: android android-listview android-arrayadapter linkify


【解决方案1】:

查看日志中的异常,似乎您在分配ArrayAdapter时使用了应用程序上下文。例如,如果您的代码类似于以下内容:

    listView.setAdapter(new ArrayAdapter<String>(context,
            android.R.layout.simple_list_item_1,
            data) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // ...
        }
    });

您必须已经使用应用程序上下文初始化了上面的 context 变量,如下所示:

    Context context = getApplicationContext();

为避免该错误,您应该使用 Activity 实例对其进行初始化:

    Context context = this;

或者,如果您的代码位于Fragment

    Context context = getActivity();

【讨论】:

    【解决方案2】:

    如果你有兴趣打开链接,可以使用

    String text = "<a href=\"http://www.google.co.in/\">Google</a>";
    holder.content.setText(Html.fromHtml(text));
    holder.content.setMovementMethod(LinkMovementMethod.getInstance());
    

    这对你在 ListView 中会很好用。

    【讨论】:

    • 但是您不能在活动上下文之外运行其他活动(浏览器)。 Linkify 使打开浏览器的 URL 可单击。这仍然会导致异常。我必须以某种方式使用活动上下文链接我的content。如果这是可能的,你能解释为什么这会起作用吗?我想知道。
    • 我试过这是我的应用程序,它在非 Activity(Adapter) 类中也能正常工作。
    • 我一个小时后到家,试试这个。谢谢!
    • 这不是我想要的。我没有 HTML 代码,但它们只是以“http://”和“www.”开头的文本。你的方法正在寻找HTML anchors &lt;a&gt;
    • 这就是我的意思,将 HTML 应用到您的文本(链接)并使其正常工作。
    【解决方案3】:

    在您的 Activity.Java 中,同时将您的列表与适配器绑定

    YourAdapter yourAdapter = new YourAdapter(YourCurrentActivityName.this, YourArrayList);
    yourListView.setAdapter(yourAdapter); 
    

    在 Constructor 的 YourAdapter.java 中,确保它是 Activity 而不是 Context

    public YourAdapter(Activity context, YourArrayList list){
        this.context = context;
        this.list = list;
    }
    

    并且,将此代码用于 Linkify 适配器中的文本视图。

    holder.yourTextView.setLinksClickable(true);
    holder.yourTextView.setMovementMethod(LinkMovementMethod.getInstance());
    Linkify.addLinks(holder.yourTextView, Linkify.ALL);
    holder.yourTextView.setAutoLinkMask(Linkify.ALL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多