2013-05-16 6 views
0

все. Мое приложение разбилось, и я не знаю, почему. Недавно я изучил FragmentTransaction. В основном, activity_main.xml содержит мой ActionBar с двумя вкладками, содержащими два фрагмента, BasicFragment и BFragment. Я хочу, чтобы BasicFragment динамически показывал фрагмент. Может кто-нибудь, пожалуйста, просветит меня, что здесь не так? Спасибо.Приложение разбилось на FragmentTransaction

activity_main.xml:

<LinearLayout 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=".MainActivity" > 

<LinearLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</LinearLayout> 

</LinearLayout> 

MainActivity.java:

public class MainActivity extends Activity { 

public static Context appContext; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    actionBar(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    BasicFragment fragmentee = new BasicFragment(); 
    fragmentTransaction.add(R.id.afrag_container, fragmentee); 
    fragmentTransaction.commit(); 
} 

private void actionBar() { 
    // TODO Auto-generated method stub 
    appContext = getApplicationContext(); 

    // ActionBar 
    ActionBar actionbar = getActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    actionbar.setDisplayShowTitleEnabled(false); 

    ActionBar.Tab PlayerTab = actionbar.newTab().setText("Fragment A"); 
    ActionBar.Tab StationsTab = actionbar.newTab().setText("Fragment B"); 

    Fragment PlayerFragment = new BasicFragment(); 
    Fragment StationsFragment = new BFragment(); 

    PlayerTab.setTabListener(new TabListener(PlayerFragment)); 
    StationsTab.setTabListener(new TabListener(StationsFragment)); 

    actionbar.addTab(PlayerTab); 
    actionbar.addTab(StationsTab); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_pow, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menuitem_search: 
     Toast.makeText(appContext, "search", Toast.LENGTH_SHORT).show(); 
     return true; 
    case R.id.menuitem_add: 
     Toast.makeText(appContext, "add", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
    return false; 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("tab", getActionBar().getSelectedNavigationIndex()); 
} 

}

класс TabListener реализует ActionBar.TabListener { фрагмент публичного фрагмента;

public TabListener(Fragment fragment) { 
    this.fragment = fragment; 
} 

@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    Toast.makeText(MainActivity.appContext, "Reselected!", 
      Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    ft.replace(R.id.fragment_container, fragment); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    ft.remove(fragment); 
} 

}

BasicFragment.java:

public class BasicFragment extends Fragment { 

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

}

afragment.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:orientation="vertical" > 

<FrameLayout 
    android:id="@+id/afrag_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</LinearLayout> 

examplefragment.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:orientation="horizontal" > 

<Button android:id="@+id/butt1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="HI!" /> 

</LinearLayout> 
+0

где вы раздуваете afragment.xml в программе – vinoth

+0

Здравствуйте, vinoth. Мне жаль, если это звучит глупо, но где я должен раздувать afragment.xml? Я думал, что писать фрагментTransaction.add (R.id.afrag_container, фрагмент) будет достаточно. – Mnemone

+0

макет afragment.xml не имеет ничего общего с вашим проектом на основе предоставленной вами информации, просто измените файл R.id.afrag_container на R.id.fragment_container. – vinoth

ответ

1

В вашей основной деятельности вы пытаетесь получить доступ к линейной компоновке, которая находится в afragment.xml, так же как и ошибка. Основная активность показывает макет activity_main.xml, измените afrag_container на фрагмент_контейнер (Linear layout), который находится в файле activity_main.xml.

+0

Здравствуйте, naveen, я только что обновил свой файл MainActivity.java. Как вы можете видеть, в ActionBar используется фрагмент_контейнер для размещения его вкладок. Я просто хочу динамически включить другой фрагмент внутри BasicFragment, но я просто не могу этого сделать Извините, если я глуп, человек. Я не знаю, что делать. – Mnemone

+0

Я только что понял, что инициализировал BasicFragment на actionBar(): Это то, что я делаю неправильно? – Mnemone

Смежные вопросы