2 つのフラグメントを含むアクティビティがあります。1 つListView
はアダプターを使用してアイテムを表示し、2 つ目はクリックされたときに特定のリスト アイテムに関する情報を表示します。
デバイスを回転させてアクティビティが再作成されるとすぐに、ListView がめちゃくちゃになり、スクロールまたはクリックできない場合があることを除いて、すべて正常に動作します (クリック アニメーションがなく、クリックしても何も起こりません)。
何か案は?マニフェストからの構成変更を無効にしたくないのは、それが良い習慣ではないことを知っているからです。
活動コード:
public class MainActivity extends FragmentActivity implements AppListFragment.AppListFragmentCallback{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppListFragment fragment = new AppListFragment();
fragment.setArguments(getIntent().getExtras());
fragment.setRetainInstance(true);
getSupportFragmentManager().beginTransaction().add(R.id.main_frame, fragment).commit();
}
@Override
public void onAppSelected(String app) {
AppDetailsFragment fragment = new AppDetailsFragment();
Bundle args = new Bundle();
args.putString(AppDetailsFragment.KEY_APP, app);
fragment.setArguments(args);
fragment.setRetainInstance(true);
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, fragment).addToBackStack(null).commit();
}
}
リスト フラグメント コード:
public class AppListFragment extends Fragment {
public interface AppListFragmentCallback {
void onAppSelected(String app);
}
private AppListFragmentCallback callback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
callback = (AppListFragmentCallback) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement AppListFragmentCallback");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_app_list, container, false);
AppListAdapter adapter = new AppListAdapter();
ListView lv = (ListView)view.findViewById(R.id.view_app_list);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("rawtypes")
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
callback.onAppSelected((String)parent.getAdapter().getItem(position));
}
});
return view;
}
}
アダプターコード:
public class AppListAdapter extends BaseAdapter implements ListAdapter {
private ArrayList<String> apps;
public AppListAdapter() {
apps = new ArrayList<String>();
for (Integer i = 0; i < 50; i++)
{
apps.add(i.toString());
}
}
@Override
public int getCount() {
return apps.size();
}
@Override
public Object getItem(int position) {
return apps.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView text = new TextView(parent.getContext());
text.setText("App number " + apps.get(position));
text.setPadding(10, 3, 10, 3);
text.setBackgroundResource(R.drawable.button_xml);
return text;
}
}
詳細ビュー フラグメント コード:
public class AppDetailsFragment extends Fragment { final static String KEY_APP = "key_app";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_app_details, container, false);
TextView textName = (TextView)view.findViewById(R.id.text_app_name);
TextView textDesc = (TextView)view.findViewById(R.id.text_app_description);
Bundle args = getArguments();
String app = args.getString(KEY_APP);
if (app == null)
return view;
textName.setText(app);
textDesc.setText("App Description");
return view;
}
}