2014-06-13 11 views
11

Sto quasi cercando di creare una semplice applicazione con un menu principale e una vista modificabile di seguito (premendo i pulsanti nel frammento del menu si modifica la vista del frammento sotto). Così, ho 2 frammenti all'interno della vista principale, ma quando si tenta di eseguire l'applicazione nell'emulatore ottengo un errore come:Errore SDK Android: tentativo di istanziare una classe che non è un frammento

Cause by android.app (bla bla bla, piece of crap Eclipse doesn't even allow copying the errors): 
Trying to instantiate a class com.example.android.topmenu that is not a fragment 

Quindi, questi sono i miei layout XML:

main.xml

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

    <fragment 
     android:id="@+id/menuFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:name="com.example.android.topmenu" > 
    </fragment> 

    <fragment 
     android:id="@+id/contentFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:name="com.example.android.bottomcontent" > 
    </fragment> 

</LinearLayout> 

topmenu.xml

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

    <Button 
     android:id="@+id/Button1" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

bottom_content.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:padding="10dp" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@+string/content_text" /> 

</LinearLayout> 

e queste sono le classi per l'attività principale ei frammenti

main_activity

package com.example.android; 

import com.example.android.R; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 

public class OLife extends Activity { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     // The activity is being created 
     super.onCreate(savedInstanceState); 
     // Set view 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     // The activity is about to be destroyed. 
     super.onDestroy(); 

     // Stop method tracing that the activity started during onCreate() 
     android.os.Debug.stopMethodTracing(); 
    } 
} 

topmenu

package com.example.android; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class OLifeMenu extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.topmenu, container, false); 
     return view; 
    } 
} 

bottomcontent

package com.example.android; 

import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;

public class OLifeMain extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.bottom_content, container, false); 
     return view; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 
} 
+0

Grazie, questo ha fatto.L'API, le esercitazioni, gli esempi, tutto sembra così incasinato allo – ali

+0

mal messo come risposta in modo che i futuri googler lo vedranno. –

risposta

48

Si deve usare FragmentActivity invece di Activity che è perché si sta utilizzando frammenti di supporto e frammenti multipli nella vostra attività principale


Modifica

È ora possibile utilizzare il Appcompat supporta la libreria ed estende AppCompatActivity per supportare la barra degli strumenti e il frammento per le API inferiori.

+1

Oppure usa uno qualsiasi degli altri derivati ​​come 'ActionBarActivity'. – faizal

+0

Grazie. Non riesco a immaginare quanto tempo mi ci sarebbe voluto per trovarlo. – Dabbler

1

Poiché si utilizzano frammenti nel layout e si suggerisce di estendere la classe dall'attività di frammento o frammento.

5

Nel mio caso si è scoperto, che stavo facendo roba in onCreate nell'ordine sbagliato:

setContentView(R.layout.activity_qr_code_scan); 
super.onCreate(savedInstanceState); 

invece di

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_qr_code_scan); 
+0

ottima cattura .. grazie –