Подтвердить что ты не робот

GetSupportFragmentManager() - undefined

Я получаю следующую ошибку: "Метод getSupportFragmentManager() - это undefined для типа 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;
}

}

Здесь код фрагмента диалога:

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

}
4b9b3361

Ответ 1

вы избавитесь от этой проблемы, сделав операцию, которая вызывает диалог, расширяя FragmentActivity

public class ObstetricsFragment1 extends FragmentActivity{

это присуще библиотеке поддержки, как показано в DIALOG SPECS и СПИСОК БИБЛИОТЕЧНЫХ ПОДДЕРЖКИ

Ответ 2

Попробуйте изменить свой код на это:

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;
}

Ответ 3

Я сделал разницу в ответе Марко, чтобы увидеть, что он действительно рекомендовал изменить: просто

d.show(getSupportFragmentManager(), "dialog");

to

FragmentManager fm = 
    ObstetricsFragment1.this.getSherlockActivity().getSupportFragmentManager();
d.show(fm, "dialog");

Ответ 4

Если кто-то использует SherlockActivity вместо SherlockFragment, просто увеличивайте активность до SherlockFragmentActivity.

Ответ 5

У меня была аналогичная проблема с загрузкой проекта урока (https://developer.android.com/training/multiple-threads).

Чтобы решить проблему, мне пришлось добавить внешний баннер (sdk/extras/android/support/v4/android-support-v4.jar).

Надеюсь, что это поможет.

Ответ 6

Вам нужно расширить ObstetricsFragment1 от SherlockDialogFragment.

Ответ 7

Получить 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");
    }

});

Ответ 8

В вашем проекте есть проблема, потому что вы используете actionBarSherlock, который устарел... Вы должны взглянуть на Поддержка Android и использовать его, потому что с ним доступен supportFragmentManager. Это довольно легко использовать, добавьте его в свой build.gradle

compile "com.android.support:support-core-utils:25.2.0"

После расширения вашей деятельности и фрагментации с помощью функции FragmentActivity или Fragment. Возможно, вам придется внести некоторые изменения из-за использования sherlock bar

Другое дело о вашей проблеме в том, что вы вызвали поддержкуFragmentManager из фрагмента... вы должны называть

getChildFragmentManager() // because it will be a nested fragment

Надеюсь, что это полезно