J'ai récemment commencé à développer une application Android qui utilise la liaison de données. Mon problème maintenant est que je ne peux pas exécuter l'application à cause de cette erreur:
Error:(10) Error parsing XML: duplicate attribute
L'erreur se produit dans tous les fichiers utilisant la liaison de données (j'utilise des fragments). Je suis sur Google depuis environ 3 heures et je ne trouve pas la solution.
build.gradle:
apply plugin: 'com.Android.application'
Android {
dexOptions {
preDexLibraries = false
javaMaxHeapSize "2g"
}
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "at.blacktasty.schooltoolmobile"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
compile files('libs/eneter-messaging-Android-7.0.1.jar')
compile 'com.Android.support:appcompat-v7:23.4.0'
compile 'com.Android.support:design:23.4.0'
compile 'com.Android.support:support-v4:23.4.0'
testCompile 'junit:junit:4.12'
}
fragment_tests.xml:
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="layout.tests">
<data>
<variable
name="deadline"
type="at.blacktasty.schooltoolmobile.viewmodel.STViewModel"/>
</data>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/list_tests"
Android:entries="@{deadline.deadline}"/>
</LinearLayout>
</layout>
tests.Java:
package layout;
import Android.databinding.DataBindingUtil;
import Android.os.Bundle;
import Android.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import at.blacktasty.schooltoolmobile.R;
import at.blacktasty.schooltoolmobile.databinding.FragmentSyncBinding;
import at.blacktasty.schooltoolmobile.databinding.FragmentTestsBinding;
import at.blacktasty.schooltoolmobile.viewmodel.STViewModel;
/**
* A simple {@link Fragment} subclass.
* create an instance of this fragment.
*/
public class tests extends Fragment {
private STViewModel stViewModel;
public tests() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
stViewModel = new STViewModel();
FragmentTestsBinding binding = DataBindingUtil.inflate(
inflater, R.layout.fragment_tests, container, false);
View view = binding.getRoot();
binding.setDeadline(stViewModel);
return view;
}
}
Et le fichier XML où l'erreur se produit (debug\layout\fragment_tests.xml). layout_width et layout_height sont marqués comme erreur:
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent" Android:tag="layout/fragment_tests_0" xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent" Android:layout_height="match_parent" tools:context="layout.tests">
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/list_tests"
Android:tag="binding_1" />
</LinearLayout>
J'espère vraiment que quelqu'un pourra m'aider.
EDIT: Voici la classe STViewModel:
public class STViewModel extends BaseObservable {
private ObservableArrayList<Deadline> m_deadline = new ObservableArrayList<>();
@Bindable
public ObservableArrayList<Deadline> getDeadline(){
return m_deadline;
}
public void setDeadline(ObservableArrayList<Deadline> value){
m_deadline = value;
notifyPropertyChanged(BR.deadline);
}
}
Je viens de découvrir quelle est la solution. Je viens juste de supprimer layout_width et layout_height de la définition <layout>
.
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="layout.tests">
au lieu de
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="layout.tests">
Assurez-vous que xmlns:Android
n'est pas automatiquement ajouté à la fois à <layout>
et à votre présentation actuelle ViewGroup
:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
...>
</Android.support.v4.widget.DrawerLayout>
</layout>
Supprimez xmlns:Android
de l'un ou l'autre endroit.
Son résolu en supprimant tous les attributs des champs <layout>
, c'est-à-dire en le gardant comme
<layout>
<data>
<variable
name=""
type="" />
</data>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
</LinearLayout>
</layout>
j'utilisais "xmlns" l'attrinute deux fois c'est pourquoi recevait une erreur.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/offwhite">
Fixé avec le code ci-dessous
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/offwhite">
Vous devriez définir
Android:orientation
propriété de LinearLayout.
Votre LinearLayout devrait être comme ça,
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:tag="layout/fragment_tests_0"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
tools:context="layout.tests">
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/list_tests"
Android:tag="binding_1" />
</LinearLayout>