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

如何从一个片段导航到另一个片段?

Android studio 动态片段根据日期

引起:java.lang.ClassCastException:android.widget.FrameLayout无法强制转换为com.appeaser.sublimepickerlibrary.S

如果使用导航控制器,如何删除某些片段中的底部导航视图和工具栏?

ProGuard:ClassCastException