2012-06-07 2 views
0

У меня есть XML-макет с картой google, двумя текстовыми представлениями и кнопкой в ​​относительной компоновке. Текстовые представления находятся ниже карты google с текстовыми значениями «Широта:» и «Долгота», которые обновляются до «Широта: xxx» и «Долгота» xxx », когда пользователь перемещает курсор на карте. «Отправить» и делает именно это, он упаковывает lat/lon в намерение и передает его на следующую операцию.Ошибка XML-макета Android

Все было в порядке, пока я не начал возиться с макетом. Я заметил это, потому что я лениво использовал Инструмент графического дизайна в eclipse, все заданные размеры, что означает, что на больших экранах это выглядело глупо.

Я добавил еще один относительный макет и поместил в него длинные тексты и кнопку отправки и разместил новый макет под другим относительный макет, который теперь имеет только MapView.

Мое намерение состояло в том, чтобы использовать android: layout_weight, чтобы назначить нижний относительный макет примерно на 15% или около экрана на botton, а остальная часть экрана будет отображаться на карте google.

Физически размеры были прекрасными. Однако, если бы у меня было текстовое изображение, зависящее от кнопки отправки вообще (андроид: layout_above/ниже), текст кнопки отправки принимал бы значение текстового просмотра, зависящего от него, и обновлялся, в то время как текстовое изображение застряло бы на «lat/long: "и не будет обновляться.

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

Вот мой XML-файл:

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

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="80" > 

    <com.google.android.maps.MapView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/mapView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:apiKey="xxx" 
     android:clickable="true" 
     android:enabled="true" > 
    </com.google.android.maps.MapView> 
</RelativeLayout> 


<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="20" > 

    <TextView 
     android:id="@+id/Latitude" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Latitude:" /> 

    <TextView 
     android:id="@+id/Longitude" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/Latitude" 
     android:text="Longitude:" /> 

    <Button 
     android:id="@+id/submitbutton" 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:onClick="GOTOUPLOADER" 
     android:text="Submit" /> 

</RelativeLayout> 

И вот только (я думаю), соответствующий код, который работает с этим XML-файлом. Обратите внимание: я ничего не делаю с текстом кнопки здесь. Это даже не атрибут в этом классе. Единственное взаимодействие, которое имеет кнопка с этим классом, заключается в том, что он вызывает метод для запуска другого действия при нажатии.

//setupmap()instantiates mapview and centers on the given location 
public void setupmap() 
    { 
     getcoords();//setup coordinates 
     lattext.setText("Latitude: "+String.valueOf(Lat)); 
     lontext.setText("Longitude: "+String.valueOf(Long)); 
     mapView = (MapView) findViewById(R.id.mapView);//instantiate mapview 
     mapView.setBuiltInZoomControls(true);//able to zoom 
     mcontrol = mapView.getController();//mapcontroller contains methods to manipulate mapview 
     mcontrol.animateTo(point);//zoom to our geopoint 
     mcontrol.setZoom(19);//zoom level 1-21. 1=world view, 21=as zoomed in as possible 
     MyOverlay over = new MyOverlay();//instantiate overlay 
     listofoverlays = mapView.getOverlays();//create a list of overlays 
     listofoverlays.clear();//clear list 
     listofoverlays.add(over);//add our overlay 
     mapView.invalidate();//invalidate for changes to take effect 
    }//setupmap 

Пожалуйста, простите все комментарии.

+0

Я не понял пункт в 5º. Ваша проблема в том, что TextViews не обновляются?И опубликуйте xml с проблемой. –

+0

Я уверен, что это не связано, но вам не хватает ''. А также MapView 'android: enabled =" true "' устарел, используйте 'android: state_enabled =" true "' – jnthnjns

+0

@AlexOliveira, если вы измените ориентацию текста в зависимости от кнопки отправки, текст кнопки отправки станет значение зависимого текстового представления и больше не будет вызывать метод «ГОТОУПЛАДОК», указанный андроидом: onclick. Так что, если бы у меня было текстовое представление широты ниже submitbutton с помощью android: layout_below = "submitbutton", атрибут text submitbutton стал бы 42.76485 или каким бы то ни было значением широты и щелчком он ничего не сделал. – 0nyx

ответ

1

Хорошо, я до сих пор не уверен, что я понимаю ваш вопрос полностью, но начать пытаться решить эту проблему:

То, что я сделал здесь взят код и поместил реляционное позиционирование обратно на него. Обратите внимание, что если вы связываете один объект с другим, вы должны поместить объект, который хотите ссылаться, ниже объекта, на который будет ссылаться. Это связано с тем, что id не находится в сгенерированном R.java, пока он не будет объявлен android:[email protected]+id/object. В этом случае, если вы хотите объявить объект как above другой, мы строим снизу вверх.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:baselineAligned="false" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="80" > 

     <com.google.android.maps.MapView 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/mapView" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:apiKey="xxx" 
      android:clickable="true" 
      android:enabled="true" > 
     </com.google.android.maps.MapView> 
    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="20" > 

     <Button 
      android:id="@+id/submitbutton" 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" 
      android:text="Submit" /> 

     <TextView 
      android:id="@+id/Longitude" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_above="@id/submitbutton" 
      android:text="Longitude:" /> 

     <TextView 
      android:id="@+id/Latitude" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_above="@id/Longitude" 
      android:layout_alignParentLeft="true" 
      android:text="Latitude:" /> 
    </RelativeLayout> 

</LinearLayout> 

Edit:

Судя по вашему примеру, вы проблема, кажется, в вашем Java. Как вы звоните на TextView, чтобы использовать setText вы покажите это?

Смотрите пример ниже:

TextView lattext = (TextView)findViewById(R.id.Latitude); 
lattext.setText("Latitude: " + String.valueOf(Lat)); 

// And 

TextView lontext= (TextView)findViewById(R.id.Longitude); 
// Avoid using "Long", Long is reserved... If I am unsure of whether text is reserved 
// I will always place my initials in front of it... i.e. "String.valueOf(jjLong));" 
lontext.setText("Latitude: " + String.valueOf(Lon)); 
+0

Я изменил свой XML-документ в соответствии с тем, что вы сделали, и я все еще получаю ошибку. Я сделал несколько скриншотов из эмулятора, чтобы проиллюстрировать, что я вижу. NOBUG-клиент: //imageshack.us/photo/my-images/835/righta.png/. BUG-http: //imageshack.us/photo/my-images/259/wrongu.png/ – 0nyx

+0

См. Edit, чтобы ответить выше. – jnthnjns

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