5

In meiner Aktivität (die android.support.v7.app.ActionBarActivity erweitert) Ich habe ein Fragment, das normalerweise in meine Ansichten wie folgt enthalten ist :IllegalStateException: DialogFragment kann nicht an eine Containeransicht angehängt werden - (in ActionBarActivity)

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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" 
    > 
    <fragment 
     android:name="com.fragments.SomeFragment" 
     android:id="@+id/fragment_id" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</FrameLayout> 

Das funktioniert gut.

Aber ich habe beschlossen, dieses Fragment als Dialog wieder zu verwenden, also habe ich es um android.support.v4.app.DialogFragment (von unterstützter Bibliothek) erweitert.

Ohne weitere Änderungen bekomme ich die Ausnahme

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ExampleActivity}: java.lang.IllegalStateException: DialogFragment can not be attached to a container view 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
at android.app.ActivityThread.access$600(ActivityThread.java:141) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5041) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 

    Caused by: java.lang.IllegalStateException: DialogFragment can not be attached to a container view 
at android.support.v4.app.DialogFragment.onActivityCreated(DialogFragment.java:364) 
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1486) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877) 
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552) 
at com.*.RoboActionBarActivity.onStart(RoboActionBarActivity.java:58) 
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164) 
at android.app.Activity.performStart(Activity.java:5114) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153) 
... 11 more 

wie ich dieses Problem lösen kann oder mein Standard-Fragment als Dialog verwenden?

Meine Aktivität:

public class SomeActivity extends RoboActionBarActivity{ 

    private SomeFragment someFragment; 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.actvity_some); 

     this.someFragment = (SomeFragment) getSupportFragmentManager().findFragmentById(
      R.id.fragment_id); 
    } 
} 

RoboActionBarActivity ist ein ActionBarActivity die RoboContext implementiert (von RoboGuice) zur Injektion zu ermöglichen.

public class RoboActionBarActivity extends ActionBarActivity implements RoboContext { 
private EventManager eventManager; 
private final HashMap<Key<?>, Object> scopedObjects = new HashMap<Key<?>, Object>(); 

@Inject 
private ContentViewListener ignored; // BUG find a better place to put this 

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    final RoboInjector injector = RoboGuice.getInjector(this); 
    this.eventManager = injector.getInstance(EventManager.class); 
    injector.injectMembersWithoutViews(this); 
    super.onCreate(savedInstanceState); 
    this.eventManager.fire(new OnCreateEvent(savedInstanceState)); 
} 

@Override 
protected void onRestart() { 
    super.onRestart(); 
    this.eventManager.fire(new OnRestartEvent()); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    this.eventManager.fire(new OnStartEvent()); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    this.eventManager.fire(new OnResumeEvent()); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    this.eventManager.fire(new OnPauseEvent()); 
} 

@Override 
protected void onNewIntent(final Intent intent) { 
    super.onNewIntent(intent); 
    this.eventManager.fire(new OnNewIntentEvent()); 
} 

@Override 
protected void onStop() { 
    try { 
     this.eventManager.fire(new OnStopEvent()); 
    } finally { 
     super.onStop(); 
    } 
} 

@Override 
protected void onDestroy() { 
    try { 
     this.eventManager.fire(new OnDestroyEvent()); 
    } finally { 
     try { 
      RoboGuice.destroyInjector(this); 
     } finally { 
      super.onDestroy(); 
     } 
    } 
} 

@Override 
public void onConfigurationChanged(final Configuration newConfig) { 
    final Configuration currentConfig = getResources().getConfiguration(); 
    super.onConfigurationChanged(newConfig); 
    this.eventManager.fire(new OnConfigurationChangedEvent(currentConfig, newConfig)); 
} 

@Override 
public void onContentChanged() { 
    super.onContentChanged(); 
    RoboGuice.getInjector(this).injectViewMembers(this); 
    this.eventManager.fire(new OnContentChangedEvent()); 
} 

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    this.eventManager.fire(new OnActivityResultEvent(requestCode, resultCode, data)); 
} 

@Override 
public Map<Key<?>, Object> getScopedObjectMap() { 
    return this.scopedObjects; 
} 
} 
+0

Können Sie den relevanten Teil des Codes anzeigen? – Szymon

+0

Können Sie genauer sein, was meinen Sie mit relevanten Teilen? – salcosand

+0

Genau das, was Sie hinzugefügt haben :) – Szymon

Antwort

1

Ich weiß, das vor einiger Zeit gefragt wurde, aber die Art, wie ich um diesen bekam, war mein Fragment zu erstellen dynamisch anstatt in xml. Es gibt wahrscheinlich eine bessere Lösung, aber das hat es für mich funktioniert.

public class MyActivity { 

    private MyFragment mMyFragment; 

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

     if (savedInstanceState == null) { 
      mMyFragment = new MyFragment(); 
      if (mMyFragment != null) { 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       fragmentManager.beginTransaction() 
        .add(android.R.id.content, mMyFragment) 
        .commit(); 
      } 
     } 
    } 
} 
1

können Sie dieses Problem beheben, wenn Sie setShowsDialog(false) irgendwo in onCreate() innerhalb Ihres DialogFragment aufzurufen.

Sie müssen jedoch setShowsDialog(true) aufrufen, wenn Sie dieses Fragment als Dialog verwenden möchten.

+0

Wenn Sie dies verwenden, wann und wo sollte 'setShowDialog (true)' aufgerufen werden, wenn ich das Fragment als ein Dialogfeld agian zeigen möchte? – prom85