gpt4 book ai didi

java - 我如何在Android中实现 fragment 的通用ArrayList?

转载 作者:行者123 更新时间:2023-12-01 18:44:14 25 4
gpt4 key购买 nike

所以我正在尝试实现一种使用我所有的 Fragment 的方法类来创建 Array List<? extends Fragment>在我的MainActivity.java类是 ArrayList使用扩展 Fragment 的不同对象类(class)。

我这样做的主要原因是使用android.support.v4.jar加载 fragment 。支持库ViewPager查看。

这是我到目前为止所拥有的,但我无法添加 extend Fragment 的不同对象进入我的ArrayList

public List<? extends Fragment> getFragments(){
List<? extends Fragment> ipsumFragments = new ArrayList<Fragment>();
ipsumFragments.add(BaconIpsumFragment.newInstance());
ipsumFragments.add(BuseyIpsumFragment.newInstance());
ipsumFragments.add(LoremIpsumFragment.newInstance());

return ipsumFragments;
}

我只是想尝试使用 ViewPager 和多个 fragment 。如果有人可以帮助我,我将不胜感激。

这是我的第一个类 Fragment ,其他的完全一样,只是命名不同,使用不同XML布局

public class BaconIpsumFragment extends Fragment{

public static final BaconIpsumFragment newInstance(){

BaconIpsumFragment baconFragment = new BaconIpsumFragment();
Bundle args = new Bundle();
baconFragment.setArguments(args);
return baconFragment;
}

@Override
public void onAttach(Activity activity){
// Attempt to attach to the parent activity
super.onAttach(activity);
}

// Called when the parent activity creates the fragment
@Override
public void onCreate(Bundle savedInstanceState){
// Perform the default behavior
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
return inflater.inflate(R.layout.bacon_fragment, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
// Last attempt to change any variables
super.onActivityCreated(savedInstanceState);
}

}

以及我的 Activity 的全面实现。当尝试添加 fragment 实例时,我的错误发生在 getFragments() 方法中。

public class MainActivity extends FragmentActivity {

private ActionBar tabbedActionBar = null;
private String [] ipsumsArray = null;
private Resources resources = null;
private FragmentManager manager = null;
private FragmentTransaction transaction = null;

private List<Fragment> mIpsumFragments = null;
private LoremIpsumViewPager pagerAdapter = null;

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

// Get the resources object
resources = getResources();
// get the String array from resources
ipsumsArray = resources.getStringArray(R.array.ipsums_array);

// Get all the fragments that we will attempt to display
mIpsumFragments = getFragments();

// get a reference to the action bar
tabbedActionBar = getActionBar();
// set the navigation mode for the action bar
tabbedActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

for (int i = 0; i < ipsumsArray.length; i++){
Tab tab = tabbedActionBar.newTab();
tab.setText(ipsumsArray[i]);
tab.setTabListener(tabListener);
tabbedActionBar.addTab(tab);
}

// setDefaultTab();


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

private TabListener tabListener = new TabListener(){

@Override
public void onTabReselected(Tab tab, FragmentTransaction arg1) {
// TODO Auto-generated method stub

}

@Override
public void onTabSelected(Tab tab, FragmentTransaction arg1) {

// Get the fragment manager
manager = getFragmentManager();
transaction = manager.beginTransaction();


int tabSelected = tab.getPosition();


@Override
public void onTabUnselected(Tab tab, FragmentTransaction arg1) {
// TODO Auto-generated method stub

}

};



private List<Fragment> getFragments(){
List<Fragment> ipsumFragments = new ArrayList<Fragment>();

ipsumFragments.add(BaconIpsumFragment.newInstance());
ipsumFragments.add(BuseyIpsumFragment.newInstance());
ipsumFragments.add(LoremIpsumFragment.newInstance());

return ipsumFragments;
}

}

最佳答案

根本不需要使用通配符。只需将您的列表声明为:

List<Fragment> ipsumFragments = new ArrayList<Fragment>();

它并不限制您仅添加 Fragment 的实例在列表中。您将能够添加 Fragment 的子类实例也在其中。然后将方法的返回类型更改为 List<Fragment> .

使用将列表声明为 List<? extends Fragment>是您可以分配该引用, Fragment 的任何子类的列表。因此,您可以分配 List<BaconIpsumFragment> , List<LoremIpsumFragment> , 就是这样。这就是为什么您无法在此类列表中添加任何子类的实例的原因,因为您不知道下面实际有什么列表。因此,您可能尝试添加 BaconIpsumFragment进入List<LoremIpsumFragment> ,这当然是不正确的。

关于java - 我如何在Android中实现 fragment 的通用ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18534804/

25 4 0