2011-03-16 6 views
3

Я заинтересован в создании пользовательского компонента Android, который расширяет текстовое представление и отображает текст внутри него как отформатированный. это код, который я написал:Android: Html TextView - это возможно?

/** * TODO */

import android.content.Context; 
import android.graphics.Canvas; 
import android.text.Html; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class HtmlTextView extends TextView { 

    private static final String tag = "HtmlTextView"; 

    public HtmlTextView(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public HtmlTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public HtmlTextView(Context context) { 
     super(context); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.widget.TextView#onDraw(android.graphics.Canvas) 
    */ 
    @Override 
    protected void onDraw(Canvas canvas) { 


       setText(Html.fromHtml((String) getText())); 


     super.onDraw(canvas); 
    } 

} 

и в XML макета теста у меня есть следующий:

<com.package.ui.tools.HtmlTextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/elad" 
    android:textSize="28dip" 
    android:padding="10dip" 
    android:gravity="center"/> 

строка, определенная в strings.xml is:

<!-- testing --> 
<string name="elad">elad <b> elad </b> elad</string> 

Этот d oesnt работы, но странно, это то, что я получаю следующее исключение брошено в затмении:

java.lang.NoClassDefFoundError: org/ccil/cowan/tagsoup/Parser 
at android.text.Html.fromHtml(Html.java:125) 
at android.text.Html.fromHtml(Html.java:102) 
at com.package.ui.tools.HtmlTextView.onDraw(HtmlTextView.java:39) 
at android.view.View.draw(View.java:6740) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:452) 
at com.android.ide.common.rendering.LayoutLibrary.createLegacySession(LayoutLibrary.java:404) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:285) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1506) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1312) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1043) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:870) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partActivated(LayoutEditor.java:378) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partBroughtToTop(LayoutEditor.java:387) 
at org.eclipse.ui.internal.PartListenerList$2.run(PartListenerList.java:87) 
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
at org.eclipse.core.runtime.Platform.run(Platform.java:888) 
at org.eclipse.ui.internal.PartListenerList.fireEvent(PartListenerList.java:57) 
at org.eclipse.ui.internal.PartListenerList.firePartBroughtToTop(PartListenerList.java:85) 
at org.eclipse.ui.internal.PartService.firePartBroughtToTop(PartService.java:208) 
at org.eclipse.ui.internal.WorkbenchPagePartList.firePartBroughtToTop(WorkbenchPagePartList.java:76) 
at org.eclipse.ui.internal.WorkbenchPagePartList.fireActiveEditorChanged(WorkbenchPagePartList.java:52) 
at org.eclipse.ui.internal.PartList.setActiveEditor(PartList.java:162) 
at org.eclipse.ui.internal.WorkbenchPage.makeActiveEditor(WorkbenchPage.java:1281) 
at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3530) 
at org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:3077) 
at org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:279) 
at org.eclipse.ui.internal.EditorPane.requestActivation(EditorPane.java:98) 
at org.eclipse.ui.internal.PartPane.setFocus(PartPane.java:325) 
at org.eclipse.ui.internal.EditorPane.setFocus(EditorPane.java:127) 
at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:844) 
at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:827) 
at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137) 
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:133) 
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:269) 
at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:278) 
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1) 
at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:88) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2743) 
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1429) 
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1407) 

Кто-нибудь есть какие-либо идеи относительно того, почему я получаю эту ошибку? Является ли то, что я пытаюсь достичь, даже возможно? спасибо, e.

+0

TextView уже поддерживает некоторые элементы HTML, почему вы хотите изобрести колесо? Просто используйте: mTextSample.setText (Html.fromHtml (текст)); – Pentium10

+0

Спасибо за ответ, я забыл упомянуть, что крайне важно, чтобы приложение интернационализировалось, и именно поэтому я хочу, чтобы он использовал ресурсы из файла strings.xml для конкретного языка и предпочитал, чтобы макеты были заполнены в xml и не имели для запуска приложения для просмотра содержимого текстового поля – ekatz

ответ

4

Класс TextView уже поддерживает некоторые основные теги html с использованием Html.fromHtml, поэтому я не думаю, что вам нужно создать HtmlTextView.

Внутренне SDK использует TagSoup для разбора html (который является отсутствующим классом). Я предполагаю, что вы получаете это исключение Eclipse, когда пытаетесь просмотреть свой макет в режиме разработки. Чтобы ваш пользовательский вид правильно отображался в представлении Eclipse, вам нужно сделать некоторые особые вещи.

В любом случае, я думаю, вы можете использовать основной TextView для своих нужд.

Update:

Строки в strings.xml могут включать в себя HTML для использования с TextView.

+0

Основное текстовое представление не отображает текст, выделенный полужирным шрифтом в strings.xml, как жирный шрифт в режиме разработки. на самом деле, что происходит по какой-то странной причине, что строка определяется как: <строка имя = «Elad»> elad1 elad2 elad3 только показывает elad1 elad2 на точки зрения дизайна и elad2 не жирный ... – ekatz

+0

Вы беспокоитесь о том, как он выглядит в режиме дизайна, и как он выглядит на реальном устройстве? –

+0

вы говорите, что на реальном устройстве это будет работать, и проблема, которую я вижу, только на дизайне? – ekatz

2

Просто попробуйте:

normalTextView.setText(Html.fromHtml("<bold>Hello World!</bold>")); 

Для борьбы с strings.xml вам нужно, чтобы избежать определенных символов, как в this answer. Приведенный здесь пример:

<resources> 
    <string name="somestring"> 
     &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt; 
     Content 
    </string> 
</resources> 

Как упоминает Робби, это делается для вас автоматически при использовании редактора строк.

+2

, и если вы добавите строки, используя редактор, и не просто отредактируйте файл вручную, он ускользнет для вас. –

+0

Это удобно! Спасибо. –

+0

Вы также можете использовать Мои Жирный]]> как содержание элемента строки, как: имени <строки = «myBoldText»>Моего Жирный]]> –

Смежные вопросы