make Simple Fragment总是得到InstantiationException

时间:2014-07-05 07:29:04

标签: android fragment

你好我们只是尝试在这里使用支持库v4创建一个简单的片段... 这是我的主要活动

public class MainActivity extends FragmentActivity {

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

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    Fragment testFragment = manager.findFragmentById(R.id.listTestFragment);
    transaction.show(testFragment);
    transaction.commit();
}

}

和我的activity_main.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent" 
android:layout_height="match_parent">

<fragment android:name="com.drikvy.testfragmentgame.ListTestFragment"
        android:id="@+id/listTestFragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" />


</LinearLayout>

和我的ListTestFragment.java

public class ListTestFragment extends Fragment {

String[] data = {"aaaa", "bbbb", "cccc", "dddd"};
MainActivity activity;

public ListTestFragment(MainActivity activity) {
    this.activity = activity;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
            View view = inflater.inflate(R.layout.fragment_lores_list, null, false);

            ListView lvLores = (ListView) view.findViewById(R.id.lv_saved_lores);
            lvLores.setAdapter(new ArrayAdapter<String>(activity, android.R.id.text1, data));

            return view;
}
}

遗憾的是,android运行时说我没有空构造函数,而且我的片段类不是公共类等 什么错了?

更新

感谢Miro先生通过他的回答指出了我的代码中的主要问题。 我只想在此澄清一些问题:

  1. 首先,我不知道通过将片段放在xml布局中需要片段类提供一个空构造函数,这就是为什么我总是在logcat中获得实例化异常错误
  2. 为什么我没有在我的片段类中放置一个空构造函数的原因是因为我以前尝试制作片段我已经使用非空构造函数成功显示了片段,我通常在其中添加活动参数用于片段类中的上下文使用。但我没注意到我的xml布局上没有声明这些片段!并且当错误开始弹出时那就是

  3. 因此,如果我们在xml布局上声明了片段,那么我们必须提供一个空构造函数或根本没有构造函数。但如果我们没有在我们的xml布局上声明它们,那么我们可以故意在我们的片段类中添加任何类型的构造函数以及我们可能想要的任何参数!

1 个答案:

答案 0 :(得分:0)

您无法从片段构造函数传递活动。 Fragment有一个名为onAttach的方法,当片段附加到活动时会调用该方法。您可以从activity设置onAttach变量。

将此作为Fragment代码:

public class ListTestFragment extends Fragment {

    String[] data = {"aaaa", "bbbb", "cccc", "dddd"};
    MainActivity activity;

    public ListTestFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_lores_list, null, false);

        ListView lvLores = (ListView) view.findViewById(R.id.lv_saved_lores);
        lvLores.setAdapter(new ArrayAdapter<String>(activity, android.R.id.text1, data));

        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (MainActivity) activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        this.activity = null;
    }
}

此外,您不需要活动中的所有代码。 Android会自动初始化并显示片段。