【发布时间】: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