【问题标题】:ANDROID : Using DatePicker from FragmentANDROID:使用来自 Fragment 的 DatePicker
【发布时间】:2016-04-05 09:38:47
【问题描述】:

我有一个带有 TextView 的片段。单击 TextView 时,我想在不同的片段中调用 DatePicker,并且所选日期应显示在前片段的 TextView 上。

但是,我收到以下错误。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                          at com.example.vkrishnakumar.finallogin.FlightFragment.onCreate(FlightFragment.java:34) 

我点击以下链接以供参考。 Implementing DatePicker in Fragment

这是我的片段代码,其中包含一个 TextView。

import android.support.v4.app.DialogFragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class FlightFragment extends Fragment {

private TextView depDate;

public FlightFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    depDate = (TextView) getView().findViewById(R.id.book_f_dep);
    depDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getFragmentManager(), "DatePicker");
        }
    });

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    return inflater.inflate(R.layout.fragment_flight, container, false);

}
}

这是在 FlightFragment 中使用的 SelectDateFragment。

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import android.widget.TextView;
import java.util.Calendar;


public class SelectDateFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {                                 

public SelectDateFragment() {
    // Required empty public constructor
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar calendar = Calendar.getInstance();
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);
    return new DatePickerDialog(getActivity(), this, yy, mm, dd);
}

public void onDateSet(DatePicker view, int yy, int mm, int dd) {
    populateSetDate(yy, mm+1, dd);
}
public void populateSetDate(int year, int month, int day) {
    TextView t= (TextView)getView().findViewById(R.id.book_f_dep);
    t.setText(month + "/" + day + "/" + year);
}

}

【问题讨论】:

  • R.id.book_f_dep 为空。发布您设置 id 的片段的代码
  • TextView t= (TextView)getView().findViewById(R.id.book_f_dep); 的问题
  • 将getFragmentManager()替换为getActivity().getFragmentManager()

标签: java android android-fragments datepicker


【解决方案1】:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View root = inflater.inflate(R.layout.fragment_flight, container, false);
    depDate = (TextView) root.findViewById(R.id.book_f_dep);
    depDate.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        DialogFragment newFragment = new SelectDateFragment();
        newFragment.show(getFragmentManager(), "DatePicker");
    }
});
return root;

}

【讨论】:

  • 你应该在onCreateView()之后调用findView,你应该对fragment的生命周期有更好的理解
  • 不鼓励仅使用代码的答案,请添加说明如何解决问题...而不是在评论中,编辑您的答案
  • 解决了这个问题。谢谢。
【解决方案2】:

在片段生命周期中,onCreateonCreateView 之前被调用,因此由于尚未填充视图,因此您会收到空指针异常。覆盖onViewCreated 函数并在那里添加您的代码。

【讨论】:

    【解决方案3】:

    在您的 FlightFragment 片段中执行此操作

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
    
        View rootView= inflater.inflate(R.layout.fragment_flight, container, false);
    
     depDate = (TextView) getView().findViewById(R.id.book_f_dep);
        depDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment newFragment = new SelectDateFragment();
                newFragment.show(getFragmentManager(), "DatePicker");
            }
        });
    
    return rootView;
    
    }
    

    在您自己的代码中,onCreate 在 onCreateView 之前运行,因此代码抛出 NullPointerException

    【讨论】:

      【解决方案4】:

      不要

       @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
                               Bundle savedInstanceState) {
          // Inflate the layout for this fragment
      
          return inflater.inflate(R.layout.fragment_flight, container, false); // Don't do this
      
      }
      

           public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                   Bundle savedInstanceState) {
      
                    View  RootView = inflater.inflate(R.layout.fragment_flight, container, false);
      
                   depDate = (TextView) RootView.findViewById(R.id.book_f_dep); // Problem was here
                   return RootView;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        相关资源
        最近更新 更多