一週後,我仍然試圖創建一個帶有v7支持的選項卡式操作欄,以便能夠在片段之間切換。這是我在本機代碼中的第一個Android應用程序,我是Java新手。使用操作欄選項卡切換片段
我Main.Activity.java看起來像這樣
package com.example.appcompattest;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// setup action bar for tabs
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(true);
Tab tab = actionBar.newTab()
.setText(R.string.grammar)
.setTabListener(new TabListener<GrammarFragment>(
this, "GRAMMAR", GrammarFragment.class));
actionBar.addTab(tab);
tab = actionBar.newTab()
.setText(R.string.lexis)
.setTabListener(new TabListener<LexisFragment>(
this, "LEXIS", LexisFragment.class));
actionBar.addTab(tab);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
/** Constructor used each time a new tab is created.
* @param activity The host Activity, used to instantiate the fragment
* @param tag The identifier tag for the fragment
* @param clz The fragment's Class, used to instantiate the fragment
*/
public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
/* The following are each of the ActionBar.TabListener call backs */
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Check if the fragment is already initialized
if (mFragment == null) {
// If not, instantiate and add it to the activity
mFragment = Fragment.instantiate(mActivity, mClass.getName());
// Commit the transaction
ft.add(R.id.fragment_holder, mFragment, mTag);
} else {
// If it exists, simply attach it in order to show it
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
// Detach the fragment, because another one is being attached
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// User selected the already selected tab. Usually do nothing.
}
}
}
從這個
除此之外,我有一個FrameLayout裏我activity_main.xml中交換的選項卡進出稱爲fragment_holder,以及單獨的XML文件,我兩個片段。我也有兩個類,LexisFragment.java和GrammarFragment.java,它們基本相同(用語法/文法替代Lexis /詞法)並且看起來像這樣。
public class LexisFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.lexisfragment, container, false);
}
當我運行該活動時,會添加第一個片段。選擇其他選項卡會導致添加第二個片段,但不會破壞第一個片段。在隨後的選項卡更改中,片段只是保持疊加。
在每個步驟記錄的變量(MTAG和mFragment),並與ft.remove()試驗後,我敢肯定,正在發生的事情如下: 在第一個選項卡改變onTabUnselected未能分離/刪除任何東西而onTabSelected添加新的片段。然後,在成功更換標籤時,應該添加的標籤被刪除,而應該刪除的標籤被添加。我很感激任何建議。
感謝bhkiran,這解決了從onCreate方法外能夠訪問savedInstanceState的基本問題。但是,我無法解決使用它重新創建碎片的問題。最後,解決方案是將android:configChanges =「orientation」添加到清單文件中的活動。 – eggdeng
請忽略上述評論。 – eggdeng