Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 旋转设备后,ListView不再可单击_Android_Listview_Android Fragments_Android Activity - Fatal编程技术网

Android 旋转设备后,ListView不再可单击

Android 旋转设备后,ListView不再可单击,android,listview,android-fragments,android-activity,Android,Listview,Android Fragments,Android Activity,我有一个包含两个片段的活动,一个片段使用适配器显示项目的ListView,第二个片段在单击时显示特定列表项目的信息 一切正常,只是只要我旋转设备并重新创建活动,我的ListView就会乱七八糟,有时无法滚动或单击(没有单击动画,单击时不会发生任何事情) 有什么想法吗?我不想从清单中禁用配置更改,因为我知道这不是一个好的做法 活动代码: public class MainActivity extends FragmentActivity implements AppListFragment.App

我有一个包含两个片段的活动,一个片段使用适配器显示项目的
ListView
,第二个片段在单击时显示特定列表项目的信息

一切正常,只是只要我旋转设备并重新创建活动,我的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;
    }
}

}

好的,我在读了这篇文章后设法弄明白了:

显然,设置
fragment.setRetainInstance(true)
表示片段未被销毁,但活动已被销毁,并且在
onCreate()
中创建片段的新实例,即使它未被销毁

在创建新片段之前,我通过编辑活动的
onCreate()
来检查片段是否存在,从而解决了这个问题:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AppListFragment fragment = (AppListFragment)getSupportFragmentManager().findFragmentByTag(TAG_LIST_FRAGMENT);
    if (fragment == null) {
        fragment = new AppListFragment();
        fragment.setRetainInstance(true);
        fragment.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().add(R.id.main_frame, fragment, TAG_LIST_FRAGMENT).commit();
    }
}

可能活动已重新创建,而视图未重新创建?让视图引用旧的活动(回调)?我不确定“视图”是什么意思,但如果你指的是片段,那么它肯定是相关的。见答案
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AppListFragment fragment = (AppListFragment)getSupportFragmentManager().findFragmentByTag(TAG_LIST_FRAGMENT);
    if (fragment == null) {
        fragment = new AppListFragment();
        fragment.setRetainInstance(true);
        fragment.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().add(R.id.main_frame, fragment, TAG_LIST_FRAGMENT).commit();
    }
}