2016-09-18 1 views
0

Этот вопрос задан очень часто в разных ситуациях, но в течение дня я не могу найти ответ, который исправляет мою ошибку.Разбирайте файл макета андроида XML с помощью XmlPullParser

У меня есть xml-файл с именем activity_single_touch.xml внутри res/layout. Этот файл используется для добавления видов, таких как кнопки, но я также хочу иметь возможность редактировать его «вживую» (пользователь может рисовать на экране).

После андроида руководство, я попытался с помощью XmlPullParser в моей основной код Java так:

public class SingleTouchActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_single_touch); 
     XmlPullParser parser = getResources().getXml(R.xml.activity_single_touch); 
     AttributeSet attributes = Xml.asAttributeSet(parser); 
     setContentView(new SingleTouchEventView(this, attributes)); 
    } 

    public class SingleTouchEventView extends View { 
     ... 
    } 
} 

Остальная часть кода использует OnDraw и OnTouchEvent нарисовать путь в соответствии с движением пользователя, а затем недействительным.

Ошибка, которую я получаю в данный момент, «не может разрешить символ« xml ». Как я могу это исправить?

пс: Вещи, которые я попробовал (и не удалось): Использование

XmlPullParser parser =getResources().getXml(R.layout.activity_single_touch); 

и получаю ошибку "ожидаемый XML элемент",

Я прочитал над

this guide
these answeres
these as well
use of streams
use of context
moving the xml file to a different folder(could not move it)
this guide

и, конечно, в поисках Google и некоторые более StackOverflow вопросы и ответы.

ответ

0

Вы можете использовать способ getLayout, чтобы открыть файл макета и проанализировать его. Вот как вы можете разобрать его вручную.

Попробуйте это,

try { 
    XmlResourceParser parser = getResources().getLayout(R.layout.activity_single_touch); 
    int event = parser.getEventType(); 
    do{ 
     String tagName = parser.getName(); 
     if(event == XmlPullParser.START_TAG){ 
      Log.e("TagName", tagName); 
     } 
     event = parser.next(); 
    } while (event != XmlPullParser.END_DOCUMENT); 
} catch (XmlPullParserException e) { 
    e.printStackTrace(); 
} catch (Exception e){ 
    e.printStackTrace(); 
} 

Использование в вашем коде,

public class SingleTouchActivity extends AppCompatActivity { 

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

     try { 
      XmlResourceParser parser = getResources().getLayout(R.layout.activity_single_touch); 
      AttributeSet attributes = Xml.asAttributeSet(parser); 
      setContentView(new SingleTouchEventView(this, attributes)); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public class SingleTouchEventView extends View { 

    } 
} 
+0

Я не знаю, как вы хотите, чтобы я использовать это - я попытался изменить эту строку: XmlPullParser парсер = GetResources() .getXml (R.xml.activity_single_touch); в блок кода, который вы мне дали, и это не сработало. Я также попытался переключить эту строку на: XmlResourceParser parser = getResources(). GetLayout (R.layout.activity_single_touch); и не работает. Что я делаю неправильно? – yo1122

+0

Что вы подразумеваете под этим не работает? Не отображается ли 'TagName'? –

+0

Прежде всего - он говорит мне по этой строке: Атрибуты атрибута = Xml.asAttributeSet (парсер); «не удается разрешить синтаксический анализатор символов». Я думал, что это проблема с областью, поэтому я изменил первые несколько строк вашего кода на: XmlResourceParser parser; try { parser = getResources(). GetLayout (R.layout.activity_main); ... Но тогда он говорит, что «переменный» синтаксический анализатор «возможно, не был инициализирован». Что еще мне делать? Btw - просто чтобы убедиться, что я использую этот код в нужном месте, все это в методе OnCreate вместо строки, указанной в приведенном выше комментарии. – yo1122

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