2つのフラグメントを含むaHorizontalScrollView
があります。フラグメントAにはリストがあり、フラグメントBにはフラグメントAで選択したアイテムの詳細が表示されます。両方のフラグメントには特定の幅があるため、合計幅が画面よりも大きく、水平スクロールが有効になっています。 。可能な詳細ビューの1つには、。を含むフォームが含まれていますEditText
。
JellyBeanの前は、詳細フラグメントを置き換えても、水平スクロールの位置に影響を与えることはありませんでした。しかし、4.1.1では、ユーザーがフォームタイプの詳細を含むアイテムを選択し、EditTextをクリックしてから別のアイテムを選択した場合(キーボードを非表示にするには戻るを押し、両方のフラグメントが表示されるように少し右にスクロールします)、HorizontalScrollView
0にスクロールして戻ります。
FragmentLayout
ApiDemosに基づいた問題を示すコードを次に示します。
package com.example.testproject;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.util.TypedValue;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class FragmentLayout extends FragmentActivity {
public static final String[] TITLES = { "Row 1", "Row 2", "Row 3", "Row 4",
"Row with EditText as detail" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_layout);
Fragment sideList = getSupportFragmentManager().findFragmentById(
R.id.titles);
if (sideList == null) {
sideList = new TitlesFragment();
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
ft.replace(R.id.titles, sideList, "side_list").commit();
}
}
public static class TitlesFragment extends ListFragment {
int mCurCheckPosition = 0;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_activated_1,
TITLES));
if (savedInstanceState != null) {
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
}
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
showDetails(mCurCheckPosition);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
showDetails(position);
}
void showDetails(int index) {
mCurCheckPosition = index;
getListView().setItemChecked(index, true);
Fragment details = getFragmentManager().findFragmentById(
R.id.details);
if (index < 4) {
details = DetailsFragment.newInstance(index);
} else {
details = FormFragment.newInstance(index);
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
public static class DetailsFragment extends Fragment {
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
Display display = getActivity().getWindowManager()
.getDefaultDisplay();
LinearLayout l = new LinearLayout(getActivity());
TextView text = new TextView(getActivity());
l.addView(text);
text.getLayoutParams().width = display.getWidth();
int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()
.getResources().getDisplayMetrics());
text.setPadding(padding, padding, padding, padding);
// use the ApiDemos Shakespeare.java file for the DIALOGUe
text.setText(Shakespeare.DIALOGUE[getShownIndex()]);
return l;
}
}
public static class FormFragment extends Fragment {
public static FormFragment newInstance(int index) {
FormFragment f = new FormFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
Display display = getActivity().getWindowManager()
.getDefaultDisplay();
LinearLayout l = new LinearLayout(getActivity());
EditText text = new EditText(getActivity());
l.addView(text);
text.getLayoutParams().width = display.getWidth();
return l;
}
}
}
そして唯一の興味深いxmlfragment_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/titles"
android:layout_width="300dip"
android:layout_height="fill_parent" />
<FrameLayout
android:id="@+id/details"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="?android:attr/detailsElementBackground" />
</LinearLayout>
</HorizontalScrollView>