【问题标题】:The method getApplicationContext() is undefined and the constructor DatePickerDialog is undefined方法 getApplicationContext() 未定义,构造函数 DatePickerDialog 未定义
【发布时间】:2014-07-22 06:36:07
【问题描述】:

我已经通过了这个link。但是给定的解决方案并不能解决我的问题。所有经验丰富的人建议使用getActivty().getApplicationContext()。但我使用的是普通课程而不是活动。我正在获取所有 UI 值并初始化为我的片段中的对象。所以从那里我试图将它保存在我的数据库中。我正在为没有扩展任何东西的数据库使用普通类。

当我将值从我的主片段传递到数据库类时,我遇到了两个错误:

  1. 构造函数 DatePickerDialog(TopRatedFragment, DatePickerDialog.OnDateSetListener, int, int, int) 未定义
  2. 创建方法getApplicationContext()

请给我一些想法来解决这个问题。

这是我的 Fragment 类代码。

public class TopRatedFragment extends Fragment {
    public EditText text1,text2,text3,text4;
    Button date,save;
    TextView textdate;
    DatePicker datepicker;
    ListView expenselist;
    private int myear,mmonth,mday;
    ArrayList<String> DayExpenseList = new ArrayList<String>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_main, container,
            false);
        text1 = (EditText) rootView.findViewById(R.id.editText1);
        text2=(EditText) rootView.findViewById(R.id.editText2);
        text3=(EditText) rootView.findViewById(R.id.editText3);
        text4=(EditText) rootView.findViewById(R.id.editText4);
        textdate = (TextView) rootView.findViewById(R.id.textView6);
        save = (Button) rootView.findViewById(R.id.button1);
        date=(Button) rootView.findViewById(R.id.datepicker);
        expenselist = (ListView) rootView.findViewById(R.id.listView1);
        date.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                DatePickerDialog dpd = new DatePickerDialog(TopRatedFragment.this, mDateSetListener, myear, mmonth, mday);
                dpd.show();
            }
        });
        final Calendar c = Calendar.getInstance();
        myear = c.get(Calendar.YEAR);
        mmonth = c.get(Calendar.MONTH);
        mday = c.get(Calendar.DAY_OF_MONTH);
        save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String entertainment = text1.getText().toString();
                String food = text2.getText().toString();
                String medicine = text3.getText().toString();
                String travel = text4.getText().toString();
                DBHelper helper = new DBHelper(getApplicationContext());
                helper.insertValues(entertainment, food, medicine, travel);
                DayExpenseList = helper.getValues();
                setAdapter();
            }
        });
        return rootView;
    }

    private void setAdapter()
    {
        expenselist.setAdapter(new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_list_item_1,DayExpenseList));
    }

    private void updateDisplay() {
        // TODO Auto-generated method stub
        textdate.setText(new StringBuilder()
            .append(mday).append("-").append(mmonth+1).append("-")
            .append(myear));
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener = new 
        DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                myear=year;
                mmonth=monthOfYear;
                mday=dayOfMonth;
                updateDisplay();
            }
        };
}

【问题讨论】:

  • 在Fragment 内,使用getActivity() 来获取Context。
  • 如果您只是在发布的代码中遇到了您提到的错误,那么这无关紧要。构造函数只需要一个 Context 传递给它们;它们是活动还是片段都没有关系。
  • 为什么你得到了意见?因为视图是从View rootView = inflater.inflate(R.layout.activity_main, container,false); 膨胀而来的,并且默认情况下,Fragments 与活动上下文绑定,它们是从哪个活动发起的。第二:为什么 DatePickerDialog 给出异常?因为日期选择器需要上下文并且您将片段实例传递给它,所以您可以随时通过getActivity() 在片段中检索上下文/活动。希望它能解决您的查询以及异常。
  • 是的。我明白了。错误消失了。我可以知道为什么我会遇到这个错误:构造函数 DatePickerDialog 是未定义的。
  • 使用getActivity() 而不是TopRatedFragment.this。

标签: android android-fragments android-context


【解决方案1】:

getApplicationContext() 仅在Context 和所有扩展它的类中可用(包括Activity 及其变体)。但是,Fragment 没有扩展它,因此没有那个方法。

相反,Fragment 依赖于 Activity 的上下文,可以通过调用 getActivity() 来访问。

错误提示:

  1. 构造函数 DatePickerDialog(TopRatedFragment, DatePickerDialog.OnDateSetListener, int, int, int) 未定义
  2. 创建方法getApplicationContext()

第一个是因为DatePickerDialog 期望Context 用于第一个参数,而您将Fragment 放在其中,它不是Context 的子类。

第二个上面已经解释过了。

把代码改成

DatePickerDialog dpd = new DatePickerDialog(getActivity(), mDateSetListener,
                               myear, mmonth, mday);

和

DBHelper helper = new DBHelper(getActivity());

应该修复错误。

【讨论】:

    【解决方案2】:

    在片段中你使用 getActivity() 而不是 getApplicationContext()

    【讨论】:

      【解决方案3】:

      在 Fragment 使用活动的上下文中,所以改变

          DBHelper helper = new DBHelper(getApplicationContext());
      

      到

          DBHelper helper = new DBHelper(container.getContext());
      

      并将ViewGroup container 用作final

      或使用getActivity() 获取活动上下文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 2011-04-11
        • 2020-09-30
        • 1970-01-01
        相关资源
        最近更新 更多