Tengo un código muy simple en el que utilizo la barra de acciones con fragmentos de pestañas. Funciona bien después de la carga, pero después del cambio de orientación se vuelve loco. El viejo fragmento también es visible (¿por qué?).Android Action Bar Tab con vista de desplazamiento hecha vista duplicada después del cambio de orientación
Lo siento por los textos húngaros en la imagen, pero espero que no importe.
Adjunto el código, quizás ayude a resolver este problema.
Actividad principal:
public class Main extends Activity
{
private static ActionBar actionBar;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// setup action bar for tabs
actionBar = getActionBar();
actionBar.removeAllTabs();
if (actionBar.getTabCount() == 0)
{
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar.newTab().setText(R.string.starter).setTabListener(new TabListener<Starter>(this, "starter", Starter.class));
actionBar.addTab(tab);
tab = actionBar.newTab().setText(R.string.newword).setTabListener(new TabListener<NewWord>(this, "newwod", NewWord.class));
actionBar.addTab(tab);
tab = actionBar.newTab().setText(R.string.feedback).setTabListener(new TabListener<Feedback>(this, "feedback", Feedback.class));
actionBar.addTab(tab);
}
if (savedInstanceState != null)
{
actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
}
}
TabListener (igual que Google ejemplo):
public class TabListener<T extends Fragment> implements android.app.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;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft)
{
// User selected the already selected tab. Usually do nothing.
}
@Override
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());
ft.add(android.R.id.content, mFragment, mTag);
} else
{
// If it exists, simply attach it in order to show it
ft.attach(mFragment);
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft)
{
if (mFragment != null)
{
// Detach the fragment, because another one is being attached
ft.detach(mFragment);
}
}
}
Fragmento:
public class Starter extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
setRetainInstance(false);
return inflater.inflate(R.layout.newword, container, false);
}
}
y el diseño XML:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" >
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@string/newword"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/newwordtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/wordhint" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@string/description"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<EditText
android:id="@+id/descriptionwordtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/descriptionhint"
android:inputType="textMultiLine"
android:minLines="4" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@string/origin"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<EditText
android:id="@+id/origintext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/originhint" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@string/source"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<EditText
android:id="@+id/sourcetext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/sourcehint" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="@string/name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<EditText
android:id="@+id/nametext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" />
<Button
android:id="@+id/sendbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/send" />
</LinearLayout>
</ScrollView>
¡Gracias de antemano!
Lo único que agregaría es que esta línea "mFragment = mActivity.getFragmentManager(). FindFragmentByTag (mTag);" También se debe agregar en el método onTabUnselected before the mFragment! = Check null. De lo contrario, funcionó muy bien! – SBerg413
mFragment = mActivity.getFragmentManager(). FindFragmentByTag (mTag); Resolvió mi problema también, la clase no necesita ser interna y privada. – Goldorak84