I have an android fragment that only restores the last portion of a class object when the orientation changes. My code is below:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments().containsKey(ARG_ITEM_ID)) {
// Load the weapon content specified by the fragment
mWeapon = EquipmentContent.WEAPON_MAP.get(getArguments().getString(ARG_ITEM_ID));
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_fragment, container, false);
// get reference to the ImageViews
weaponImageView = (ImageView) rootView.findViewById(R.id.picture);
groupImageView = (ImageView) rootView.findViewById(R.id.groupSymbol);
individualImageView = (ImageView) rootView.findViewById(R.id.individualSymbol);
// get a reference to the linear layout
statLinearLayout = (LinearLayout) rootView.findViewById(R.id.statLinearLayout);
if (mWeapon != null) {
AssetManager assets = getActivity().getAssets();
InputStream pictureStream;
InputStream groupStream;
InputStream individualStream;
try
{
// get an InputStream to the asset representing the next picture
pictureStream = assets.open("Pictures/" + mWeapon.picture + ".png");
// load the asset as a Drawable and display on the ImageView
Drawable picture = Drawable.createFromStream(pictureStream, mWeapon.picture);
weaponImageView.setImageDrawable(picture);
}
catch (IOException e)
{
Log.e("MainFragment", "Error loading " + mWeapon.picture + ".png", e);
}
try
{
// get an InputStream to the asset representing the next picture
groupStream = assets.open("Group/" + mWeapon.group + ".png");
// load the asset as a Drawable and display on the ImageView
Drawable group = Drawable.createFromStream(groupStream, mWeapon.group);
groupImageView.setImageDrawable(group);
}
catch (IOException e)
{
Log.e("MainFragment", "Error loading " + mWeapon.group + ".png", e);
}
try
{
// get an InputStream to the asset representing the next picture
individualStream = assets.open("Individual/" + mWeapon.individual + ".png");
// load the asset as a Drawable and display on the ImageView
Drawable individual = Drawable.createFromStream(individualStream, mWeapon.individual);
individualImageView.setImageDrawable(individual);
}
catch (IOException e)
{
Log.e("MainFragment", "Error loading " + mWeapon.individual + ".png", e);
}
((TextView) rootView.findViewById(R.id.item_detail)).setText(mWeapon.id); // Sets the title text of the fragment
populateStatistics(inflater);
}
return rootView;
}
public void populateStatistics(LayoutInflater inflater) {
// TODO: currently reverts all EditText views to the last input upon orientation change
if (!mWeapon.priWeapon.equals("null")) { // if the primary weapon is not null, then inflate relevant TextViews
TableLayout priWeaponIDTableLayout = (TableLayout) inflater.inflate(R.layout.statistics_text_view, null); // Weapon title statistic
statLinearLayout.addView(priWeaponIDTableLayout);
((TextView) priWeaponIDTableLayout.findViewById(R.id.category)).setText(R.string.priWeapon);
((EditText) priWeaponIDTableLayout.findViewById(R.id.statistic)).setText(String.format("%s", mWeapon.priWeapon));
TableLayout priWeaponRangeTableLayout = (TableLayout) inflater.inflate(R.layout.statistics_text_view, null); // Weapon range statistic
statLinearLayout.addView(priWeaponRangeTableLayout);
((TextView) priWeaponRangeTableLayout.findViewById(R.id.category)).setText(R.string.priMaxRange);
((TextView) priWeaponRangeTableLayout.findViewById(R.id.category)).setTypeface(null, Typeface.NORMAL);
((TextView) priWeaponRangeTableLayout.findViewById(R.id.statistic)).setTypeface(null, Typeface.NORMAL);
((EditText) priWeaponRangeTableLayout.findViewById(R.id.statistic)).setText(String.format("%s meters", mWeapon.priMaximumRange));
TableLayout priWeaponPenTableLayout = (TableLayout) inflater.inflate(R.layout.statistics_text_view, null); // Weapon penetration statistic
statLinearLayout.addView(priWeaponPenTableLayout);
((TextView) priWeaponPenTableLayout.findViewById(R.id.category)).setText(R.string.priPen);
((TextView) priWeaponPenTableLayout.findViewById(R.id.category)).setTypeface(null, Typeface.NORMAL);
((TextView) priWeaponPenTableLayout.findViewById(R.id.statistic)).setTypeface(null, Typeface.NORMAL);
((EditText) priWeaponPenTableLayout.findViewById(R.id.statistic)).setText(String.format("%s mm", mWeapon.priPenetration));
}
}
The custom layout that I inflate and modify is below.
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="*">
<!-- Table Row 0 -->
<TableRow
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:id="@+id/tableRow0">
<TextView
android:id="@+id/category"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/priWeapon" android:textColor="#000" android:textStyle="bold"
android:layout_weight="1"
android:gravity="left"
android:padding="5dp"/>
<EditText
android:id="@+id/statistic"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/NA" android:textSize="14sp" android:textStyle="bold"
android:gravity="center"
android:focusable="false"
android:layout_weight="1"
android:cursorVisible="false"
android:longClickable="false"/>
</TableRow>
</TableLayout>
Almost everything loads fine when the orientation changes, to include the title, the picture .png, the group and individual .pngs, the weapon id, and the weapon penetration statistic. The problem is that the weapon penetration statistic replaces the primary weapon id and maximum range for some reason. I'm not exactly sure why. Any assistance is appreciated.
I tinkered with my code and changed the common flawed denominator view type, 'EditText', to 'TextView'. It now retains the data that it's supposed to. For some reason EditText savedInstanceState isn't persistent but TextView is. I was using EditText originally because the Dietel book I was using used it for the benefit of the underline it provided. Now I'll just have to create a custom background to replicate that underline and apply it in the XML.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.