ClassCastException片段android使用ActionBar
Posted
技术标签:
【中文标题】ClassCastException片段android使用ActionBar【英文标题】:ClassCastException fragment android using ActionBar 【发布时间】:2014-07-28 07:43:29 【问题描述】:我有一个FragmentActivity
,它曾经使用getSupportFragmentManager()
调用DatePicker
。一切都很好,直到我使用本教程实现了“标签”http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/
为了使它工作,我的旧 MainActivity(用于扩展 FragmentActivity
)现在是一个片段(我将在下面放一些代码)。
对于 Eclipse 上显示的一些错误(如下所述),我不得不将 getSupportFragmentManager()
更改为 getFragmentManager()
,现在当我尝试选择日期时应用程序崩溃了。
代码如下:
我实现了 TabsPageAdapter 就像教程一样,支持导入
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
MainActivity.java(就像教程一样)版本
import android.app.ActionBar;
import android.app.ActionBar.Tab;
**import android.app.FragmentTransaction;**
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity implements ActionBar.TabListener
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = "Latest Events", "Search Events", "News Feed" ;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : tabs)
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
@Override
public void onPageSelected(int position)
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
@Override
public void onPageScrolled(int arg0, float arg1, int arg2)
@Override
public void onPageScrollStateChanged(int arg0)
);
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft)
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
// on tab selected
// show respected fragment view
viewPager.setCurrentItem(tab.getPosition());
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft)
在这里,我首先怀疑我是否导入了 FragmentTransaction 的 support.v4 版本,我在实现 ActionBar.TabListener 函数(即 onTabSelected)时遇到了错误。他们不被认可,它抱怨没有实施。
SearchEventsFragment.java 是选项卡之一(以前是 MainActivity)
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.util.Log;
public class SearchEventsFragment extends Fragment implements DatePickerFragment.DateListener
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
//super.onCreateView(inflater, container, savedInstanceState);
View rootview = inflater.inflate(R.layout.fragment_search_events, container, false);
从这个片段中我称之为 PickDate
mPickDateFrom.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
mCurrentDisplay = mDateFromDisplay;
DialogFragment picker = new DatePickerFragment();
picker.show(getFragmentManager(), "datePicker");
);
如果我尝试使用getSupportFragmentManager()
,我会收到一个错误,因为 View.onClickListener 类型未定义
最后是 DatePickerFragment 的实现,它返回选择的日期
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener
DateListener listener;
public interface DateListener
public void returnDate(String date);
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
listener = (DateListener) getActivity();
// Create a new instance of TimePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year,month,day);
@Override
public void onDateSet(DatePicker view, int year, int month,int day)
// Do something with the date chosen by the user
Calendar c = Calendar.getInstance();
c.set(year, month, day);
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
String formattedDate = sdf.format(c.getTime());
if (listener != null)
listener.returnDate(formattedDate);
还有日志错误
E/AndroidRuntime(11267): FATAL EXCEPTION: main
E/AndroidRuntime(11267): java.lang.ClassCastException:com.csn.myapp.MainActivity cannot
be cast to com.csn.myapp.DatePickerFragment$DateListener
我知道我可能弄乱了受支持的版本和新版本,但我不知道如何修复它(如果我更改某些内容会出现另一个问题)。
看了很多类似的问题,也有很多答案,建议不要使用支持的版本,还有人建议使用ActionBarSherlock
【问题讨论】:
发布所有 MainActivity。 你什么时候使用过 DatePickerFragment 【参考方案1】:问题是您将 DateListener 实现为 Fragment 而不是活动。
listener = (DateListener) getActivity();
当您调用 getActivity() 时,它会调用活动。
你应该实现 MainActivity 的监听器
【讨论】:
如果我评论该行,则部署对话框,谢谢。但是,实现 MainActivity 的“监听器”是什么意思? 最后我删除了监听器并在显示选择器的类上实现了 OnDateSet ***.com/a/14751675/2631891 MainActivity 扩展 FragmentActivity 实现 ActionBar.TabListener、DatePickerDialog.OnDateSetListener 这就是我所说的实现到活动的意思。以上是关于ClassCastException片段android使用ActionBar的主要内容,如果未能解决你的问题,请参考以下文章
将新Fragment添加到SectionsPagerAdapter时的ClassCastException
引起:java.lang.ClassCastException:android.widget.FrameLayout无法强制转换为com.appeaser.sublimepickerlibrary.S