您的位置:首页 > Web前端 > JavaScript

JSON解析的内容中含有table标签怎么处理以及自定义标签的处理

2014-11-04 14:50 555 查看
一、普遍情况

private void handlerHtmlTag(String data) {
textView.setText(Html.fromHtml(data));
}


二、自定义标签处理

GameTagHandler

package com.example.htmldemo;

import org.xml.sax.XMLReader;

import android.content.Context;
import android.text.Editable;
import android.text.Html.TagHandler;
import android.text.Spanned;
import android.text.style.ClickableSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class GameTagHandler implements TagHandler {
private int startIndex = 0;
private int stopIndex = 0;
private Context mContext;

public GameTagHandler(Context context) {
super();
this.mContext = context;
}

@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if (tag.equalsIgnoreCase("game")) {
if (opening) {
startGame(tag, output, xmlReader);
} else {
endGame(tag, output, xmlReader);
}
}

}

public void startGame(String tag, Editable output, XMLReader xmlReader) {
output.append("");
startIndex = output.length();
}

public void endGame(String tag, Editable output, XMLReader xmlReader) {
output.append("\n");
stopIndex = output.length();
output.setSpan(new GameSpan(), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

private class GameSpan extends ClickableSpan implements OnClickListener {

@Override
public void onClick(View v) {
// 跳转某页面
Toast.makeText(mContext, "点击了game标记之间的内容", Toast.LENGTH_SHORT).show();
}
}
}
MainActivity中

private static final String dataTag = "点击<game ><span>这里</span></game>跳转到游戏";
handlerGameTag(dataTag);
private void handlerGameTag(String data) {
textView.setText(Html.fromHtml(data, null, new GameTagHandler(this)));
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());//设置点击事件
}
显示效果



三、table标签处理

TableTagHandler

package com.example.htmldemo;

import org.xml.sax.XMLReader;

import android.content.Context;
import android.text.Editable;
import android.text.Html.TagHandler;
import android.text.Spanned;

public class TableTagHandler implements TagHandler {
private Context mContext;
private int startIndex;
private int endIndex;

public TableTagHandler() {
super();
}

public TableTagHandler(Context mContext) {
super();
this.mContext = mContext;
}

@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if (tag.equalsIgnoreCase("table")) {
tableTagHanlder(opening, tag, output, xmlReader);
} else if (tag.equalsIgnoreCase("tbody")) {
tBodyTagHandler(opening, tag, output, xmlReader);
} else if (tag.equalsIgnoreCase("tr")) {
trTagHandler(opening, tag, output, xmlReader);
} else if (tag.equalsIgnoreCase("td")) {
tdTagHandler(opening,tag,output,xmlReader);
}

}

private void tableTagHanlder(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if (opening) {
startIndex = output.length();
} else {
output.append("\n");
endIndex = output.length();
}
}

private void tBodyTagHandler(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if (opening) {
startIndex = output.length();
} else {
endIndex = output.length();
}
}
private void trTagHandler(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if(opening){
startIndex = output.length();
}else{
output.append("\n");
endIndex = output.length();
}

}
private void tdTagHandler(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if(opening){
startIndex  = output.length();
}else{
output.append("\t");
endIndex = output.length();
}

}
}


MainActivity中

private static final String dataTag2 = "<table>" + "<tbody>" + "<tr><td>number</td><td>title</td><td>size</td></tr>" + "<tr><td>21</td><td>22</td><td>23</td></tr>"+ "<tr><td>31</td><td>32</td><td>33</td></tr>" + "</tbody>" + "</table>";


handlerTableTag(dataTag2);


private void handlerTableTag(String data) {
textView.setText(Html.fromHtml(data, null, new TableTagHandler(this)));

}
显示效果



上面显示的表格如果表格比较长,或者每个框中的内容长短不一,就无法对齐,复杂的表格更加无法看懂。所以上面的情况只能针对一些简单的表格。

四、完美解决table标签的显示问题

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical" >

<include layout="@layout/titlebar_readmore" />

<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp" >

<TextView
android:id="@+id/read_more_text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<WebView
android:id="@+id/read_more_text_webview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone" />

<TextView
android:id="@+id/read_more_text_footer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
</ScrollView>

</LinearLayout>


ReadMoreActivity

package com.sound.chinabuye.activity;

import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.TextView;

import com.sound.chinabuye.R;

public class ReadMoreActivity extends Activity implements OnClickListener {
private ImageView back_to_main;
private TextView header, footer;
private WebView webView;
private String text;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_readmore);
/*** 管理Activity ****/
manageActivity();
// 取出数据
text = getIntent().getStringExtra("description");
// 初始化控件
initView();

}
private void initView() {
back_to_main = (ImageView) this.findViewById(R.id.back_to_main);
back_to_main.setOnClickListener(this);
header = (TextView) this.findViewById(R.id.read_more_text_header);
webView = (WebView) this.findViewById(R.id.read_more_text_webview);
footer = (TextView) this.findViewById(R.id.read_more_text_footer);
<span style="color:#ff0000;">if (text.contains("<table")) {
webView.setVisibility(View.VISIBLE);
footer.setVisibility(View.VISIBLE);
String[] arr1 = text.split("<table");
header.setText(Html.fromHtml(arr1[0]));

String[] arr2 = arr1[1].split("</table>");
String str2 = "<table" + arr2[0] + "</table>";
webView.loadDataWithBaseURL(null, str2, "text/html", "utf-8", null);
footer.setText(Html.fromHtml(arr2[1]));
} else {
header.setText(Html.fromHtml(text));
}</span>
}

private void manageActivity() {
ActivityInstanceManager.getActivityInstanceManager().addActivity(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back_to_main:
finish();
overridePendingTransition(R.anim.activity_open, R.anim.activity_close);
break;
default:
break;
}
}

}


上面的if...else判断针对是否有table标签分别作了处理,如果没有table标签,直接使用Html工具处理;如果有table标签,将含有table标签的部分抽取出来用webview进行显示,其余的部分用Html进行处理,通过TextView显示。

显示效果如下:

没有表格的情况:



有表格的情况:



在有表格的情况下,不管多复杂的表格都完美展示,即使表格太长也没有问题,可以左右滚动进行查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐