2013-02-15 2 views
1

Я решил переключиться с нескольких действий на одно действие, которое переключается между фрагментами, однако приложение теперь сбой.Android crashing at getSupportFragmentManager()

Вот активность я добавляю фрагмент в

общественного класса MainActivity расширяет SherlockFragmentActivity {

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

    MyFragment fragment = new MyFragment(); 

    fragment.setArguments(getIntent().getExtras()); 

    getSupportFragmentManager().beginTransaction() 
    .add(R.id.fragment_container, fragment).commit(); 

} 

Вот фрагмент его наблюдатель и имеет функциональные возможности, но для экономии места плохого просто показать создание

public class MyFragment extends SherlockFragment implements Observer{ 

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

     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.my_fragment, container, false); 
    } 

Heres my_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/my_fragment" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

... HAS SOME TEXT VIEWS HERE! 
</RelativeLayout> 

Катастрофа я получаю

02-15 16:17:41.079: E/AndroidRuntime(18668): FATAL EXCEPTION: main 
02-15 16:17:41.079: E/AndroidRuntime(18668): java.lang.RuntimeException: 
Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.MainActivity}: 
java.lang.IllegalArgumentException: 
No view found for id 0x7f040036 for fragment MyFragmentt{41a05910 #0 id=0x7f040036} 

Может кто-нибудь помочь мне здесь? Я не могу понять, что вызывает это. Я знаю, что если я прокомментирую getSupportFragmentManager() в основном действии (верхний блок кода в этом сообщении), он будет запускать просто не рисовать что-либо в моем фрагменте.

UPDATE

frame_container, который я не уверен, где разместить

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/fragment_container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 
+0

ли вы объявивший 'FrameLayout' с этим идентификатором' R.id.fragment_container'? – hardartcore

+0

У меня есть это, но я не уверен, что если у меня есть это место в правильном месте, это должно быть его собственное xml fle или оно должно быть в my_fragment.xml или в my activity_main.xml? Первый раз, используя фрагменты, чтобы я мог совершить тупую ошибку user2015852

+0

Для того, чтобы было легче читать, я добавил контейнер рамы на начальный вопрос – user2015852

ответ

0

Так как вы можете использовать в своих приложениях Fragments два. Первый способ, если вы объявляете фрагмент в файле XML, как это:

<fragment android:name="com.example.news.ArticleReaderFragment" 
     android:id="@+id/viewer" 
     android:layout_weight="2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" /> 

Второй способ, если добавить/заменить фрагменты динамически на ваш контейнер, который в большинстве примеров является FrameLayout. Вот как вы можете сделать это:

в главном FragmentActivity:

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

и в вашем XML myFragmentContainer.xml где вы поместите fragment_container и это выглядит:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

и вы добавив и заменив Fragments следующим образом:

if (findViewById(R.id.fragment_container) != null) { 

     if (savedInstanceState != null) { 
      return; 
     } 

     // Create an instance of ExampleFragment 
     HeadlinesFragment firstFragment = new HeadlinesFragment(); 
     // if there are any extras 
     firstFragment.setArguments(getIntent().getExtras()); 

     // Add the fragment to the 'fragment_container' FrameLayout 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, firstFragment).commit(); 
    } 

и для следующего фрагмента, который вы хотите показать просто сделать:

getSupportFragmentManager().beginTransaction() 
        .replace(R.id.fragment_container, secondFragment).commit(); 
+0

Спасибо за помощь, которая работает отлично сейчас. – user2015852