2016-01-10 14 views
67

Ich versuche, Datenbindung Beispiel von offiziellen google doc https://developer.android.com/tools/data-binding/guide.htmlSo verwenden Sie Datenbindung mit Fragmente

außer zu folgen, dass ich versuche, Daten-Abwarten auf ein Fragment anzuwenden, keine Tätigkeit.

die Fehler, die ich zur Zeit bin immer wenn kompiliert

Error:(37, 27) No resource type specified (at 'text' with value '@{marsdata.martianSols}.

onCreate für Fragment wie folgt aussieht:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MartianDataBinding binding = MartianDataBinding.inflate(getActivity().getLayoutInflater()); 
    binding.setMarsdata(this); 
} 

onCreateView für Fragment wie folgt aussieht:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.martian_data, container, false); 
} 

und Teil s meiner Layout-Datei für Fragment sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable 
      name="marsdata" 
      type="uk.co.darkruby.app.myapp.MarsDataProvider" /> 
    </data> 
... 

     <TextView 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      android:text="@{marsdata.martianSols}" 
     /> 

    </RelativeLayout> 
</layout> 

mein Verdacht ist, dass MartianDataBinding nicht weiß, welche Layout-Datei es soll mit gebunden sein - also den Fehler. Irgendwelche Vorschläge?

Antwort

150

Die Datenbindung Implementierung in der onCreateView Methode des Fragments sein muß, löschen Sie alle Datenbindung, die in Ihrer OnCreate Methode existiert, Ihre onCreateView sollten wie folgt aussehen:

public View onCreateView(LayoutInflater inflater, 
         @Nullable ViewGroup container, 
         @Nullable Bundle savedInstanceState) { 
    MartianDataBinding binding = DataBindingUtil.inflate(
      inflater, R.layout.martian_data, container, false); 
    View view = binding.getRoot(); 
    //here data must be an instance of the class MarsDataProvider 
    binding.setMarsdata(data); 
    return view; 
} 
+0

das ist genau die Lösung, die ich zu mir selbst kam, nachdem ich damit herumgespielt habe, hat die Antwort hier nie gepostet, danke! Sie bekommen die Zecke! –

+0

Ich musste den Aufruf zu Super hinzufügen, um meine Binding-Klasse generieren zu lassen. –

+1

Wow. Ich hatte zwei Tage lang mit meinem Kopf zu kämpfen, bis ich deine Antwort @hdioui abdeljalil sah. Vielen Dank!! –

5

Man kann einfach Ansicht Objekt abrufen wie unten erwähnt

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot(); 

return view; 

} 
1

Versuchen Sie, diese in Android Databinding

FragmentMainBinding binding; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false); 
     View rootView = binding.getRoot(); 
     initInstances(savedInstanceState); 
     return rootView; 
} 
4

in meinem Code arbeiten.

private FragmentSampleBinding dataBiding; 
private SampleListAdapter mAdapter; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    dataBiding = DataBindingUtil.inflate(inflater, R.layout.fragment_sample, null, false); 
    return mView = dataBiding.getRoot(); 
} 
19

Sie tatsächlich nutzen, um die inflate Methode Ihrer erzeugten Bindung und nicht die DataBindingUtil ermutigt:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false); 
    //set variables in Binding 
    return binding.getRoot(); 
} 

Docs for DataBindingUtil.inflate():

Verwenden Sie diese Version nur, wenn layoutId im Voraus nicht bekannt ist . Andernfalls verwenden Sie die generierte Binding-Methode, um eine typsichere Inflation zu gewährleisten.

+0

Leider bringt mich das mit dem Fehler 'kann nicht zu einem Typ aufgelöst werden 'auf Build. Es ist meiner Meinung nach nicht zuverlässig. Wenn ich zuerst mit 'DataBindingUtil.inflate (inflater, R.layout.fragment_camera, container, false);' und dann in 'FragmentCameraBinding.inflate (inflater, container, false);' ändere, funktioniert es, aber nach dem Neuaufbau gibt den Fehler erneut. –

+0

Funktioniert gut. Eigentlich keine Notwendigkeit, Layout-Res-ID (was ich mich schon einmal gefragt), da es automatisch aus der generierten Bindungsdatei wählt. –

1

Kotlin Syntax:

lateinit var binding: MartianDataBinding 
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
    binding = DataBindingUtil.inflate(inflater, R.layout.martian_data, container, false) 
    return binding.root 
} 
0

Ein weiteres Beispiel in Kotlin:

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
    val binding = DataBindingUtil 
      .inflate<MartianDataBinding>(
        inflater, 
        R.layout.bla, 
        container, 
        false 
      ) 

    binding.modelName = // .. 

    return binding.root 
} 

Beachten Sie, dass der Name "MartianDataBinding" ist abhängig von dem Namen der Layoutdatei. Wenn die Datei den Namen "martian_data" hat, lautet der korrekte Name "MartianDataBinding".