片段和ListFragment不兼容 [英] Fragment and ListFragment incompatibility
本文介绍了片段和ListFragment不兼容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这样的方法启动,当我从菜单中选择一个页面。问题是,其中的一些扩展片段
就像从案例1到6,而其他延长 ListFragment
在情况7
我得到一个:类型不匹配:不能从ItemListFragment转换成片段
错误
我要如何解决这个问题?
包com.prjma.lovertech.activity;
进口的java.util.ArrayList;
进口android.app.Activity;
进口android.content.res.Configuration;
进口android.content.res.TypedArray;
进口android.os.Bundle;
进口android.support.v4.app.ActionBarDrawerToggle;
进口android.support.v4.app.ListFragment;
//进口android.app.ListFragment;
进口android.app.Fragment;
进口android.app.FragmentManager;
进口android.app.FragmentTransaction;
进口android.support.v4.widget.DrawerLayout;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.AdapterView;
进口android.widget.ListView;
进口com.prjma.lovertech.R;
进口com.prjma.lovertech.R.array;
进口com.prjma.lovertech.R.drawable;
进口com.prjma.lovertech.R.id;
进口com.prjma.lovertech.R.layout;
进口com.prjma.lovertech.R.menu;
进口com.prjma.lovertech.R.string;
进口com.prjma.lovertech.adapter.NavDrawerListAdapter;
进口com.prjma.lovertech.fragment *。
进口com.prjma.lovertech.model.NavDrawerItem;
进口com.prjma.lovertech.util.SessionManager;
公共类WallActivity延伸活动{
私人DrawerLayout mDrawerLayout;
私人的ListView mDrawerList;
私人ActionBarDrawerToggle mDrawerToggle;
//导航抽屉称号
私人的CharSequence mDrawerTitle;
//用于存储应用程序标题
私人的CharSequence mTitle;
//滑动菜单项
私有String [] navMenuTitles;
私人TypedArray navMenuIcons;
私人的ArrayList< NavDrawerItem> navDrawerItems;
私人NavDrawerListAdapter适配器;
//会话管理器类
公众是SessionManager会议;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_wall);
//会话管理器
会议=新SessionManager(中间getApplicationContext());
/ **
*每当你要检查用户登录调用此函数
*这将用户重定向到LoginActivity是,他是不是
* 登录
* * /
session.checkLogin();
mTitle = mDrawerTitle =的getTitle();
//负荷滑动菜单项
navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。
//导航抽屉,从资源的图标
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerList =(ListView控件)findViewById(R.id.list_slidermenu);
navDrawerItems =新的ArrayList< NavDrawerItem>();
//添加导航抽屉里的物品数组
// 家
navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1)));
// Messaggi
navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1)));
// Oggettti seguiti
navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1)));
// Oggetti acquistati,将在这里添加计数器
navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1),真,22));
//在vendita
navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1)));
// Venduti
navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1),真正的50+));
// Invenduti
navDrawerItems.add(新NavDrawerItem(navMenuTitles [6],navMenuIcons.getResourceId(6,-1),真,3));
// 列表显示
navDrawerItems.add(新NavDrawerItem(navMenuTitles [7],navMenuIcons.getResourceId(7,-1)));
//回收类型数组
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(新SlideMenuClickListener());
//设置导航抽屉名单适配器
适配器=新NavDrawerListAdapter(getApplicationContext()
navDrawerItems);
mDrawerList.setAdapter(适配器);
//使操作栏中的应用程序图标,它表现为切换按钮
getActionBar()setDisplayHomeAsUpEnabled(真)。
getActionBar()setHomeButtonEnabled(真)。
mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
R.drawable.ic_drawer,//导航菜单切换图标
R.string.app_name,//导航抽屉打开 - 说明访问
R.string.app_name //导航抽屉关闭 - 说明访问
){
公共无效onDrawerClosed(查看视图){
。getActionBar()的setTitle(mTitle);
//调用prepareOptionsMenu()来显示操作栏图标
invalidateOptionsMenu();
}
公共无效onDrawerOpened(查看drawerView){
。getActionBar()的setTitle(mDrawerTitle);
//调用prepareOptionsMenu()隐藏操作栏图标
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
如果(savedInstanceState == NULL){
//关于第一导航项目首次显示视图
displayView(0);
}
}
/ **
*滑动菜单项,点击监听器
* * /
私有类SlideMenuClickListener工具
ListView.OnItemClickListener {
@覆盖
公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,
长ID){
对选定的导航抽屉的项目//显示视图
displayView(位置);
}
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
。getMenuInflater()膨胀(R.menu.menu,菜单);
返回true;
}
→
包com.prjma.lovertech.fragment;
进口com.prjma.lovertech.R;
进口android.app.Fragment;
进口android.os.Bundle;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
公共类InvendutiFragment扩展片段{
公共InvendutiFragment(){}
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
查看rootView = inflater.inflate(R.layout.fragment_invenduti,集装箱,假);
返回rootView;
}
}
LL
包com.prjma.lovertech.fragment;
进口android.app.Activity;
进口android.os.Bundle;
进口android.support.v4.app.ListFragment;
进口android.view.View;
进口android.widget.AbsListView;
进口android.widget.AdapterView;
进口android.widget.ArrayAdapter;
进口android.widget.ListView;
进口com.prjma.lovertech.dummy.DummyContent;
/ **
*列表片段重新presenting项目的列表。这个片段也支持
*通过允许列表项平板设备被赋予在一个激活状态
*选择。这有助于指示哪个项目当前正在查看的
* {@link ItemDetailFragment}。
*所述p为H.;
*含该片段活动必须贯彻{@link回调}
* 接口。
* /
公共类ItemListFragment扩展ListFragment {
/ **
*序列化(保存实例状态)软件包密钥再presenting的
*启动项的位置。仅用于平板电脑。
* /
私有静态最后弦乐STATE_ACTIVATED_POSITION =activated_position;
/ **
*片段的当前回调对象,它被通知的列表项的
*点击。
* /
私人回调mCallbacks = sDummyCallbacks;
/ **
*当前激活项目的位置。仅用于平板电脑。
* /
私人诠释mActivatedPosition = ListView.INVALID_POSITION;
/ **
*含有该片段的所有活动的回调接口必须
* 实现。此机制允许项目的活动,以通知
*选择。
* /
公共接口回调{
/ **
*回调时,项目已被选定为。
* /
公共无效onItemSelected(字符串ID);
}
/ **
*一个虚拟实现,它的{@link回调}接口
*什么都没有。时才使用该片段没有连接到活动。
* /
私有静态回调sDummyCallbacks =新的回调(){
@覆盖
公共无效onItemSelected(字符串ID){
}
};
/ **
*必须填写空的构造的片段经理来实例化
*片段(如在屏幕方向变化)。
* /
公共ItemListFragment(){
}
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
// TODO:换成一个真正的名单适配器。
setListAdapter(新ArrayAdapter&其中; DummyContent.DummyItem>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,DummyContent.ITEMS));
}
@覆盖
公共无效onViewCreated(查看视图,捆绑savedInstanceState){
super.onViewCreated(查看,savedInstanceState);
//恢复previously连载启动项的位置。
如果(savedInstanceState!= NULL
&功放;&安培; savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)){
setActivatedPosition(savedInstanceState
.getInt(STATE_ACTIVATED_POSITION));
}
}
@覆盖
公共无效onAttach(活动活动){
super.onAttach(活动);
//活动包含该片段必须实现回调。
如果(!(活动的instanceof回调)){
抛出新IllegalStateException异常(
活动必须实现片段的回调。);
}
mCallbacks =(回调)的活动;
}
@覆盖
公共无效onDetach(){
super.onDetach();
//重置活性回调接口到哑实施。
mCallbacks = sDummyCallbacks;
}
@覆盖
公共无效onListItemClick(ListView控件的ListView,视图中查看,INT位置,
长ID){
super.onListItemClick(ListView控件,观点,立场,身份证);
//通知活性回调接口(活性,如果
//片段连接到一个),该项目已经被选择。
mCallbacks.onItemSelected(DummyContent.ITEMS.get(位置).ID);
}
@覆盖
公共无效的onSaveInstanceState(包outState){
super.onSaveInstanceState(outState);
如果(mActivatedPosition!= AdapterView.INVALID_POSITION){
//序列化和持久化启动项目的位置。
outState.putInt(STATE_ACTIVATED_POSITION,mActivatedPosition);
}
}
/ **
*启用激活上点击模式。当该模式上,列表项将是
*给出的激活状态,触摸时。
* /
公共无效setActivateOnItemClick(布尔activateOnItemClick){
//当设置CHOICE_MODE_SINGLE,ListView控件会自动
触摸时//给项目的激活状态。
getListView()。setChoiceMode(
activateOnItemClick? AbsListView.CHOICE_MODE_SINGLE
:AbsListView.CHOICE_MODE_NONE);
}
私人无效setActivatedPosition(INT位置){
如果(位置== AdapterView.INVALID_POSITION){
getListView()setItemChecked(mActivatedPosition,假)。
} 其他 {
getListView()setItemChecked(位置,真正的)。
}
mActivatedPosition =位置;
}
}
解决方案
我会做这种方式:
私人无效displayView(INT位置){
//更新替换片段的主要内容
片段片段= NULL;
ListFragment listfragment = NULL;
开关(位置){
情况下0:
片段=新HomeFragment();
打破;
情况1:
片段=新MessaggiFragment();
打破;
案例2:
片段=新OggettiSeguitiFragment();
打破;
案例3:
片段=新OggettiAcquistatiFragment();
打破;
壳体4:
片段=新InVenditaFragment();
打破;
壳体5:
片段=新VendutiFragment();
打破;
情况6:
片段=新InvendutiFragment();
打破;
案例7:
listfragment =新ItemListFragment();
打破;
默认:
打破;
}
如果(片段!= NULL){
//做的东西,如果它是一个片段
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container,片段).commit();
}否则,如果(listfragment!= NULL){
//做的东西,如果它是一个listfragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container,listfragment).commit();
} 其他 {
//创建片段错误
Log.e(MainActivity,创建片段错误);
}
I have this method that launches a page when I select it from a menu. The problem is that some of these extend Fragment
like from case 1 to 6, while others extend ListFragment
as in case 7.
I get a: Type mismatch: cannot convert from ItemListFragment to Fragment
error.
How do I solve this?
package com.prjma.lovertech.activity;
import java.util.ArrayList;
import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.ListFragment;
//import android.app.ListFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.prjma.lovertech.R;
import com.prjma.lovertech.R.array;
import com.prjma.lovertech.R.drawable;
import com.prjma.lovertech.R.id;
import com.prjma.lovertech.R.layout;
import com.prjma.lovertech.R.menu;
import com.prjma.lovertech.R.string;
import com.prjma.lovertech.adapter.NavDrawerListAdapter;
import com.prjma.lovertech.fragment.*;
import com.prjma.lovertech.model.NavDrawerItem;
import com.prjma.lovertech.util.SessionManager;
public class WallActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
// Session Manager Class
public SessionManager session;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wall);
// Session Manager
session = new SessionManager(getApplicationContext());
/**
* Call this function whenever you want to check user login
* This will redirect user to LoginActivity is he is not
* logged in
* */
session.checkLogin();
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Messaggi
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Oggettti seguiti
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Oggetti acquistati, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
// In vendita
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// Venduti
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
// Invenduti
navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1), true, "3"));
// ListView
navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons.getResourceId(7, -1)));
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(getApplicationContext(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
// enabling action bar app icon and behaving it as toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
// calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
l
package com.prjma.lovertech.fragment;
import com.prjma.lovertech.R;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class InvendutiFragment extends Fragment {
public InvendutiFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_invenduti, container, false);
return rootView;
}
}
ll
package com.prjma.lovertech.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.prjma.lovertech.dummy.DummyContent;
/**
* A list fragment representing a list of Items. This fragment also supports
* tablet devices by allowing list items to be given an 'activated' state upon
* selection. This helps indicate which item is currently being viewed in a
* {@link ItemDetailFragment}.
* <p>
* Activities containing this fragment MUST implement the {@link Callbacks}
* interface.
*/
public class ItemListFragment extends ListFragment {
/**
* The serialization (saved instance state) Bundle key representing the
* activated item position. Only used on tablets.
*/
private static final String STATE_ACTIVATED_POSITION = "activated_position";
/**
* The fragment's current callback object, which is notified of list item
* clicks.
*/
private Callbacks mCallbacks = sDummyCallbacks;
/**
* The current activated item position. Only used on tablets.
*/
private int mActivatedPosition = ListView.INVALID_POSITION;
/**
* A callback interface that all activities containing this fragment must
* implement. This mechanism allows activities to be notified of item
* selections.
*/
public interface Callbacks {
/**
* Callback for when an item has been selected.
*/
public void onItemSelected(String id);
}
/**
* A dummy implementation of the {@link Callbacks} interface that does
* nothing. Used only when this fragment is not attached to an activity.
*/
private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
public void onItemSelected(String id) {
}
};
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public ItemListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: replace with a real list adapter.
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, DummyContent.ITEMS));
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Restore the previously serialized activated item position.
if (savedInstanceState != null
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
setActivatedPosition(savedInstanceState
.getInt(STATE_ACTIVATED_POSITION));
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Activities containing this fragment must implement its callbacks.
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException(
"Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
// Reset the active callbacks interface to the dummy implementation.
mCallbacks = sDummyCallbacks;
}
@Override
public void onListItemClick(ListView listView, View view, int position,
long id) {
super.onListItemClick(listView, view, position, id);
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mActivatedPosition != AdapterView.INVALID_POSITION) {
// Serialize and persist the activated item position.
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
}
/**
* Turns on activate-on-click mode. When this mode is on, list items will be
* given the 'activated' state when touched.
*/
public void setActivateOnItemClick(boolean activateOnItemClick) {
// When setting CHOICE_MODE_SINGLE, ListView will automatically
// give items the 'activated' state when touched.
getListView().setChoiceMode(
activateOnItemClick ? AbsListView.CHOICE_MODE_SINGLE
: AbsListView.CHOICE_MODE_NONE);
}
private void setActivatedPosition(int position) {
if (position == AdapterView.INVALID_POSITION) {
getListView().setItemChecked(mActivatedPosition, false);
} else {
getListView().setItemChecked(position, true);
}
mActivatedPosition = position;
}
}
解决方案
I would do it this way:
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
ListFragment listfragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new MessaggiFragment();
break;
case 2:
fragment = new OggettiSeguitiFragment();
break;
case 3:
fragment = new OggettiAcquistatiFragment();
break;
case 4:
fragment = new InVenditaFragment();
break;
case 5:
fragment = new VendutiFragment();
break;
case 6:
fragment = new InvendutiFragment();
break;
case 7:
listfragment = new ItemListFragment();
break;
default:
break;
}
if (fragment != null) {
// do stuff if it's a fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
} else if (listfragment != null) {
// do stuff if its a listfragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, listfragment).commit();
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
这篇关于片段和ListFragment不兼容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文