次のエラーが発生しています: "メソッドgetSupportFragmentManager()は、タイプnew View.OnClickListener(){}"に対して未定義です以下に示すフラグメントファイル内。
ABSで参照される互換性ライブラリと適切なインポートが用意されています。互換性ライブラリとともにABSライブラリを再インストールし、プロジェクトをクリーンアップし、Eclipseを再起動しましたが、何も機能しませんでした。
基本的に、フラグメントを取得して、ダイアログフラグメントを介して日付ピッカーを表示しようとしています。日付を選択したら、その日付に基づいて情報を計算するために使用できるように、フラグメントに戻す必要があります。
これが私のフラグメントのコードです。
package com.owentech.abstabsviewpager;
import Android.app.Activity;
import Android.app.Dialog;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.view.ViewGroup;
import Android.widget.Button;
import Android.widget.Toast;
import Android.support.v4.app.DialogFragment;
import Android.support.v4.app.FragmentManager;
import Android.support.v4.app.FragmentPagerAdapter;
import Android.support.v4.app.FragmentActivity;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentTransaction;
import com.actionbarsherlock.app.SherlockFragment;
public class ObstetricsFragment1 extends SherlockFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//Fragment Layout
View view = inflater.inflate(R.layout.obstetricsfragment1, container, false);
Button mPickLMPDate = (Button) view.findViewById(R.id.pickLMPDate);
mPickLMPDate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
d.show(getSupportFragmentManager(), "dialog");
}
});
return view;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
// TODO Auto-generated method stub
return null;
}
}
Dialog Fragmentのコードは次のとおりです。
package com.owentech.abstabsviewpager;
import Android.app.Dialog;
import Android.os.Bundle;
import Android.widget.DatePicker;
import Android.app.DatePickerDialog;
public class LMPDatePickerDialogFragment extends ObstetricsFragment1 implements DatePickerDialog.OnDateSetListener {
static LMPDatePickerDialogFragment newInstance() {
LMPDatePickerDialogFragment d = new LMPDatePickerDialogFragment();
return d;
}
private int mLMPYear;
private int mLMPMonth;
private int mLMPDay;
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new DatePickerDialog(getActivity(), this, mLMPYear, mLMPMonth, mLMPDay);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
mLMPYear = year;
mLMPMonth = month;
mLMPDay = day;
}
}
最後に、これが私のアクティビティのコードです。
package com.owentech.abstabsviewpager;
import Java.util.ArrayList;
import Android.content.Context;
import Android.content.Intent;
import Android.net.Uri;
import Android.os.Bundle;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import Android.widget.TextView;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.ActionBar.Tab;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentPagerAdapter;
import Android.support.v4.app.FragmentTransaction;
import Android.support.v4.app.Fragment;
import Android.support.v4.view.ViewPager;
public class Obstetrics extends SherlockFragmentActivity
{
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
// START Action Bar Menu Items
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
switch (item.getItemId()){
case R.id.menuLog:
ChangeLog cl = new ChangeLog(this);
cl.getFullLogDialog().show();
return true;
case R.id.menuEmail:
Intent emailIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:[email protected]"));
startActivity(emailIntent);
return true;
case R.id.menuRate:
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=appinventor.ai_shawn_m_gee.MedicalDoctor"));
startActivity(browserIntent);
return true;
case Android.R.id.home:
// App icon in action bar clicked; go home
Intent intent = new Intent(this, Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case R.id.menuExit:
this.finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
//END Action Bar Menu Items
// START Tabs View Pager (Add tabs by adding mTabsAdapter.addTab)
@Override
public void onCreate(Bundle savedInstanceState)
{
// Information you want returned to your application, via onCreate(), if the activity is destroyed and restarted due to some implicit reason
super.onCreate(savedInstanceState);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
ActionBar bar = getSupportActionBar();
bar.setDisplayHomeAsUpEnabled(true);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(
bar.newTab().setText("Wheel"),
ObstetricsFragment1.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("Physical"),
HistoryPhysicalFragment2.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("ROS"),
HistoryPhysicalFragment3.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("CAGE"),
HistoryPhysicalFragment4.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("SIGECAPS"),
HistoryPhysicalFragment5.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("Glasgow"),
HistoryPhysicalFragment6.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("Neuro"),
HistoryPhysicalFragment7.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("Dermat"),
HistoryPhysicalFragment8.class, null);
mTabsAdapter.addTab(
bar.newTab().setText("Minicog"),
HistoryPhysicalFragment9.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener
{
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo
{
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args)
{
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager)
{
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args)
{
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount()
{
return mTabs.size();
}
@Override
public Fragment getItem(int position)
{
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(),
info.args);
}
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels)
{
}
public void onPageSelected(int position)
{
mActionBar.setSelectedNavigationItem(position);
}
public void onPageScrollStateChanged(int state)
{
}
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++)
{
if (mTabs.get(i) == tag)
{
mViewPager.setCurrentItem(i);
}
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft)
{
}
public void onTabReselected(Tab tab, FragmentTransaction ft)
{
}
}
// END Tabs View Pager
}
ダイアログを呼び出すアクティビティをFragmentActivityに拡張することにより、この問題を取り除くことができます。
public class ObstetricsFragment1 extends FragmentActivity{
DIALOG SPECS および SUPPORT LIBRARY SPECS に見られるように、これはサポートライブラリに固有のものです
コードを次のように変更してみてください。
public class ObstetricsFragment1 extends SherlockFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//Fragment Layout
View view = inflater.inflate(R.layout.obstetricsfragment1, container, false);
Button mPickLMPDate = (Button) view.findViewById(R.id.pickLMPDate);
mPickLMPDate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
FragmentManager fm = ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
d.show(fm, "dialog");
}
});
return view;
}
マルコの回答を実際に変更して、彼が実際に変更を推奨しているものを確認しました。
d.show(getSupportFragmentManager(), "dialog");
に
FragmentManager fm =
ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
d.show(fm, "dialog");
誰かがSherlockActivity
の代わりにSherlockFragment
を使用している場合は、アクティビティをSherlockFragmentActivity
に拡張するだけです。
レッスンプロジェクトの読み込みで同様の問題が発生しました( https://developer.Android.com/training/multiple-threads )。
解決するには、外部jar(sdk/extras/Android/support/v4/Android-support-v4.jar)を追加する必要がありました。
お役に立てれば。
SherlockDialogFragmentからObstetricsFragment1を拡張する必要があります。
フラグメントでFragmentManager
を取得するには、getChildFragmentManager()
を呼び出します。 this。 を参照してください
これを変える
mPickLMPDate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
d.show(getSupportFragmentManager(), "dialog");
}
});
に
mPickLMPDate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LMPDatePickerDialogFragment d = LMPDatePickerDialogFragment.newInstance();
d.show(getChildFragmentManager(), "dialog");
}
});