TextView的NullPointerException异常实施片段TimePicker [英] TextView NullPointerException implementing TimePicker in Fragment

查看:183
本文介绍了TextView的NullPointerException异常实施片段TimePicker的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

实施TimePicker对话框中的片段使用DialogFragment并获得抛出ClassCastException

logcat的:

  2月2日至15日:44:29.199:E / AndroidRuntime(1297):致命异常:主要
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):工艺:com.example.datetimeabs,PID:1297
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):java.lang.ClassCastException:com.example.datetimeabs.MainActivity@b1d75900必须实现com.example.datetimeabs.TimePickerFragment $ TimePickedListener
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在com.example.datetimeabs.TimePickerFragment.onAttach(TimePickerFragment.java:40)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:440)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.os.Handler.handleCallback(Handler.java:733)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.os.Handler.dispatchMessage(Handler.java:95)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.os.Looper.loop(Looper.java:136)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在android.app.ActivityThread.main(ActivityThread.java:5017)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在java.lang.reflect.Method.invokeNative(本机方法)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在java.lang.reflect.Method.invoke(Method.java:515)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
2月2日至十五日:44:29.199:E / AndroidRuntime(1297):在dalvik.system.NativeStart.main(本机方法)
2月二日至15日:44:32.679:I /流程(1297):发送信号。 PID:1297 SIG:9

我下面这个教程: http://www.lukehorvat.com /博客/ Android的时间选择器,例如/ ,你可以看到的 TimePickerFragment.java 过,对此我用我的code!

FragmentTab1.java:

 公共类FragmentTab1扩展SherlockFragment实现TimePickedListener {    按钮buttonDate;
    按钮buttonTime;    TextView的textDate;
    TextView的textTime;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragmenttab1,集装箱,FALSE);        buttonDate =(按钮)rootView.findViewById(R.id.btnDate);
        buttonTime =(按钮)rootView.findViewById(R.id.btnTime);        textDate =(TextView中)rootView.findViewById(R.id.txtDate);
        textTime =(TextView中)rootView.findViewById(R.id.txtTime);        //日历类得到的android手机时钟的当前实例
         日历C = Calendar.getInstance();         //格式化对象的日期和时间
         SimpleDateFormat的sdfTime =新的SimpleDateFormat(HH:mm的);         //保存日期和时间字符串对象。
         串strTime = sdfTime.format(c.getTime());
         textTime.setText(strTime);         SimpleDateFormat的sdfDate =新的SimpleDateFormat(DD-MMM-YYYY);
         串strDate = sdfDate.format(c.getTime());
         textDate.setText(strDate);         buttonTime.setOnClickListener(新OnClickListener()
         {
             @覆盖
             公共无效的onClick(视图v)
             {
                 //显示时间选择器对话框
                 TimePickerFragment newFragment =新TimePickerFragment();
                 newFragment.show(getActivity()getSupportFragmentManager(),timePicker);
             }
         });
        返回rootView;
    }    @覆盖
    公共无效onTimePicked(日历时间)
    {
        //在TextView中显示选定的时间
        textTime.setText(DateFormat.format(HH:mm的,时间));
    }}

MainActivity.java: -

 公共类MainActivity扩展SherlockFragmentActivity {
    //声明变量
    私人FragmentTabHost mTab​​Host;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        //设置从main_fragment.xml视图
        的setContentView(R.layout.main_fragment);        //在main_fragment.xml找到android.R.id.tabhost
        mTabHost =(FragmentTabHost)findViewById(android.R.id.tabhost);        //创建main_fragment.xml标签
        mTabHost.setup(这一点,getSupportFragmentManager(),R.id.tabcontent);        //在res文件夹的自定义图像创建TAB1
        mTabHost.addTab(mTabHost.newTabSpec(TAB1)。setIndicator(,getResources()。getDrawable(R.drawable.tab1)),
                FragmentTab1.class,NULL);        //创建TAB2
        mTabHost.addTab(mTabHost.newTabSpec(TAB2)。setIndicator(TAB2),
                FragmentTab2.class,NULL);        //创建TAB3
        mTabHost.addTab(mTabHost.newTabSpec(TAB3)。setIndicator(TAB3),
                FragmentTab3.class,NULL);
    }
}

TimePickerFragment.java: -

 公共类TimePickerFragment扩展DialogFragment实现TimePickerDialog.OnTimeSetListener
{
私人TimePickedListener mListener;@覆盖
公共对话框onCreateDialog(捆绑savedInstanceState)
{
//使用当前时间作为选择器的默认值
最后的日历C = Calendar.getInstance();
INT小时= c.get(Calendar.HOUR_OF_DAY);
INT分钟= c.get(Calendar.MINUTE);//创建TimePickerDialog的一个新实例,并将其返回
返回新TimePickerDialog(getActivity(),这个,小时,分钟,DateFormat.is24HourFormat(getActivity()));
}@覆盖
公共无效onAttach(活动活动)
{
//当最初显示的片段(即附着在活性),铸的活性回调接口类型
super.onAttach(活动);
尝试
{
mListener =(TimePickedListener)活性;
}
赶上(抛出ClassCastException E)
{
抛出新ClassCastException异常(activity.toString()+必须实现+ TimePickedListener.class.getName());
}
}@覆盖
公共无效onTimeSet(TimePicker观点,诠释HOUROFDAY,分整型)
{
被选择的时间//时,通过它的回调接口的方法将其发送到活动
日历C = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,HOUROFDAY);
c.set(Calendar.MINUTE,分钟);mListener.onTimePicked(C);
}公共静态界面TimePickedListener
{
公共无效onTimePicked(日历时间);
}
}

编辑code: 信用卡的去@Luksprog

FragmentTab1.java:

 公共类FragmentTab1扩展SherlockFragment {按钮buttonDate;
按钮buttonTime;TextView的textDate;
TextView的textTime;@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
        捆绑savedInstanceState){
    查看rootView = inflater.inflate(R.layout.fragmenttab1,集装箱,FALSE);    buttonDate =(按钮)rootView.findViewById(R.id.btnDate);
    buttonTime =(按钮)rootView.findViewById(R.id.btnTime);    textDate =(TextView中)rootView.findViewById(R.id.txtDate);
    textTime =(TextView中)rootView.findViewById(R.id.txtTime);    //日历类得到的android手机时钟的当前实例
     日历C = Calendar.getInstance();     //格式化对象的日期和时间
     SimpleDateFormat的sdfTime =新的SimpleDateFormat(HH:mm的);     //保存日期和时间字符串对象。
     串strTime = sdfTime.format(c.getTime());
     textTime.setText(strTime);     SimpleDateFormat的sdfDate =新的SimpleDateFormat(DD-MMM-YYYY);
     串strDate = sdfDate.format(c.getTime());
     textDate.setText(strDate);     buttonTime.setOnClickListener(新OnClickListener()
     {
         @覆盖
         公共无效的onClick(视图v)
         {
             //显示时间选择器对话框
             TimePickerFragment newFragment =新TimePickerFragment();
             newFragment.show(getActivity()getSupportFragmentManager(),timePicker);
         }
     });
    返回rootView;
}公共无效onTimePicked(日历时间)
{
    SimpleDateFormat的sdfTime =新的SimpleDateFormat(HH:mm的);
    串strTime = sdfTime.format(time.getTime());
    Log.i(onTimePicked>>>中,strTime);
    //在TextView中显示选定的时间
    textTime.setText(DateFormat.format(HH:mm的,时间));
 }}

MainActivity.java:

 公共类MainActivity扩展SherlockFragmentActivity实现TimePickedListener {
    //声明变量
    私人FragmentTabHost mTab​​Host;    FragmentTab1 fragmentTab1;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        //设置从main_fragment.xml视图
        的setContentView(R.layout.main_fragment);        fragmentTab1 =新FragmentTab1();        //在main_fragment.xml找到android.R.id.tabhost
        mTabHost =(FragmentTabHost)findViewById(android.R.id.tabhost);        //创建main_fragment.xml标签
        mTabHost.setup(这一点,getSupportFragmentManager(),R.id.tabcontent);        //在res文件夹的自定义图像创建TAB1
        mTabHost.addTab(mTabHost.newTabSpec(TAB1)。setIndicator(,getResources()。getDrawable(R.drawable.tab1)),
                FragmentTab1.class,NULL);        //创建TAB2
        mTabHost.addTab(mTabHost.newTabSpec(TAB2)。setIndicator(TAB2),
                FragmentTab2.class,NULL);        //创建TAB3
        mTabHost.addTab(mTabHost.newTabSpec(TAB3)。setIndicator(TAB3),
                FragmentTab3.class,NULL);
    }    @覆盖
    公共无效onTimePicked(日历时间){
        // TODO自动生成方法存根
        fragmentTab1.onTimePicked(时间);
    }}

异常行:

  textTime.setText(DateFormat.format(HH:mm的,时间));

新的日志:

  4月2日至一十五日:18:40.149:D / dalvikvm(1469):GC_FOR_ALLOC释放< 1K,4%免​​费5141K / 5324K,暂停42ms,总42ms
4月二日日至15日:18:40.349:I /编舞(1469):跳过126帧!该应用程序可能会做它的主线程的工作太多了。
4月二日日至15日:18:40.939:I /编舞(1469):46跳过帧!该应用程序可能会做它的主线程的工作太多了。
4月二日日至15日:18:49.669:I / onTimePicked>>>(1469):上午8时25分
4月二日日至15日:18:49.669:D / AndroidRuntime(1469):关闭VM
4月二日日至15日:18:49.729:W / dalvikvm(1469):主题ID = 1:螺纹未捕获的异常(组= 0xb1a94ba8)退出
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):致命异常:主要
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):工艺:com.example.datetimeabs,PID:1469
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):显示java.lang.NullPointerException
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.example.datetimeabs.FragmentTab1.onTimePicked(FragmentTab1.java:73)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.example.datetimeabs.MainActivity.onTimePicked(MainActivity.java:47)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.example.datetimeabs.TimePickerFragment.onTimeSet(TimePickerFragment.java:52)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在android.app.TimePickerDialog.tryNotifyTimeSet(TimePickerDialog.java:130)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在android.app.TimePickerDialog.onClick(TimePickerDialog.java:115)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.android.internal.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:166)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在android.os.Handler.dispatchMessage(Handler.java:102)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在android.os.Looper.loop(Looper.java:136)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在android.app.ActivityThread.main(ActivityThread.java:5017)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在java.lang.reflect.Method.invokeNative(本机方法)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在java.lang.reflect.Method.invoke(Method.java:515)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
4月二日日至15日:18:49.739:E / AndroidRuntime(1469):在dalvik.system.NativeStart.main(本机方法)


解决方案

  

实施TimePicker对话框中的片段使用DialogFragment和
  越来越抛出ClassCastException


唯一的例外是告诉你, MainActivity 需要实现 TimePickerFragment $ TimePickedListener 接口,并提供了一​​个实现 onTimePicked()方法。


  

新的日志:


看起来异常,因为你没有正确与你互动​​的片段,在你拨打 onTimePicked(时间) onTimePicked 回调错误的第一个片段选项卡。这片段是不是在 FragmentTabHost 使用了它的第一个选项卡中的片段,它只是你手动实例化一个片段(以 fragmentTab1 =新FragmentTab1( ); )。这种手动实例化片段没有连接到活动并没有一个看法,因为没有它的回调被称为。

要访问正确的片段使用 FragmentManager 先找到它:

  @覆盖
公共无效onTimePicked(日历时间){
    FragmentTab1 FT1 =(FragmentTab1)getSupportFragmentManager()findFragmentByTag(TAB1);
    fragmentTab1.onTimePicked(时间);
}

Implementing TimePicker Dialog in Fragment using DialogFragment and getting ClassCastException

Logcat:

02-15 02:44:29.199: E/AndroidRuntime(1297): FATAL EXCEPTION: main
02-15 02:44:29.199: E/AndroidRuntime(1297): Process: com.example.datetimeabs, PID: 1297
02-15 02:44:29.199: E/AndroidRuntime(1297): java.lang.ClassCastException: com.example.datetimeabs.MainActivity@b1d75900 must implement com.example.datetimeabs.TimePickerFragment$TimePickedListener
02-15 02:44:29.199: E/AndroidRuntime(1297):     at com.example.datetimeabs.TimePickerFragment.onAttach(TimePickerFragment.java:40)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.os.Handler.handleCallback(Handler.java:733)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.os.Handler.dispatchMessage(Handler.java:95)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.os.Looper.loop(Looper.java:136)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at android.app.ActivityThread.main(ActivityThread.java:5017)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at java.lang.reflect.Method.invokeNative(Native Method)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at java.lang.reflect.Method.invoke(Method.java:515)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-15 02:44:29.199: E/AndroidRuntime(1297):     at dalvik.system.NativeStart.main(Native Method)
02-15 02:44:32.679: I/Process(1297): Sending signal. PID: 1297 SIG: 9

I am following this tutorial : http://www.lukehorvat.com/blog/android-time-picker-example/ and you can see TimePickerFragment.java too, which i am using in my code!

FragmentTab1.java:

public class FragmentTab1 extends SherlockFragment  implements TimePickedListener{

    Button buttonDate;  
    Button buttonTime;  

    TextView textDate;  
    TextView textTime;  

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmenttab1, container, false);

        buttonDate = (Button) rootView.findViewById(R.id.btnDate);
        buttonTime = (Button) rootView.findViewById(R.id.btnTime);        

        textDate = (TextView) rootView.findViewById(R.id.txtDate);
        textTime = (TextView) rootView.findViewById(R.id.txtTime);  

        //  calendar class get the current instance of android phone clock
         Calendar c = Calendar.getInstance();

         // a formatted object for date and time
         SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm a");

         // save date and time in string object.
         String strTime = sdfTime.format(c.getTime());
         textTime.setText(strTime);

         SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy");
         String strDate = sdfDate.format(c.getTime());
         textDate.setText(strDate);

         buttonTime.setOnClickListener(new OnClickListener()
         {
             @Override
             public void onClick(View v)
             {
                 // show the time picker dialog
                 TimePickerFragment newFragment = new TimePickerFragment();
                 newFragment.show(getActivity().getSupportFragmentManager(), "timePicker");
             }
         });


        return rootView;
    }

    @Override
    public void onTimePicked(Calendar time)
    {
        // display the selected time in the TextView
        textTime.setText(DateFormat.format("HH:mm a", time));
    }

}

MainActivity.java:-

public class MainActivity extends SherlockFragmentActivity{
    // Declare Variables    
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set the view from main_fragment.xml
        setContentView(R.layout.main_fragment);

        // Locate android.R.id.tabhost in main_fragment.xml
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);

        // Create the tabs in main_fragment.xml
        mTabHost.setup(this, getSupportFragmentManager(), R.id.tabcontent);

        // Create Tab1 with a custom image in res folder
        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("", getResources().getDrawable(R.drawable.tab1)),
                FragmentTab1.class, null);

        // Create Tab2
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"),
                FragmentTab2.class, null);

        // Create Tab3
        mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Tab3"),
                FragmentTab3.class, null);
    }
}

TimePickerFragment.java:-

public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener
{
private TimePickedListener mListener;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);

// create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity()));
}

@Override
public void onAttach(Activity activity)
{
// when the fragment is initially shown (i.e. attached to the activity), cast the activity to the callback interface type
super.onAttach(activity);
try
{
mListener = (TimePickedListener) activity;
}
catch (ClassCastException e)
{
throw new ClassCastException(activity.toString() + " must implement " + TimePickedListener.class.getName());
}
}

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute)
{
// when the time is selected, send it to the activity via its callback interface method
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hourOfDay);
c.set(Calendar.MINUTE, minute);

mListener.onTimePicked(c);
}

public static interface TimePickedListener
{
public void onTimePicked(Calendar time);
}
}

Edited Code: Credit goes to @Luksprog

FragmentTab1.java:

public class FragmentTab1 extends SherlockFragment{

Button buttonDate;  
Button buttonTime;  

TextView textDate;  
TextView textTime;  

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragmenttab1, container, false);

    buttonDate = (Button) rootView.findViewById(R.id.btnDate);
    buttonTime = (Button) rootView.findViewById(R.id.btnTime);        

    textDate = (TextView) rootView.findViewById(R.id.txtDate);
    textTime = (TextView) rootView.findViewById(R.id.txtTime);  

    //  calendar class get the current instance of android phone clock
     Calendar c = Calendar.getInstance();

     // a formatted object for date and time
     SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm a");

     // save date and time in string object.
     String strTime = sdfTime.format(c.getTime());
     textTime.setText(strTime);

     SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy");
     String strDate = sdfDate.format(c.getTime());
     textDate.setText(strDate);

     buttonTime.setOnClickListener(new OnClickListener()
     {
         @Override
         public void onClick(View v)
         {
             // show the time picker dialog
             TimePickerFragment newFragment = new TimePickerFragment();
             newFragment.show(getActivity().getSupportFragmentManager(), "timePicker");
         }
     });


    return rootView;
}

public void onTimePicked(Calendar time)
{
    SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm a");
    String strTime = sdfTime.format(time.getTime());
    Log.i("onTimePicked >>> ", strTime);
    // display the selected time in the TextView
    textTime.setText(DateFormat.format("HH:mm a", time));
 }

}

MainActivity.java:

public class MainActivity extends SherlockFragmentActivity implements TimePickedListener {
    // Declare Variables    
    private FragmentTabHost mTabHost;

    FragmentTab1 fragmentTab1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set the view from main_fragment.xml
        setContentView(R.layout.main_fragment);

        fragmentTab1 = new FragmentTab1();

        // Locate android.R.id.tabhost in main_fragment.xml
        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);

        // Create the tabs in main_fragment.xml
        mTabHost.setup(this, getSupportFragmentManager(), R.id.tabcontent);

        // Create Tab1 with a custom image in res folder
        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("", getResources().getDrawable(R.drawable.tab1)),
                FragmentTab1.class, null);

        // Create Tab2
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"),
                FragmentTab2.class, null);

        // Create Tab3
        mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Tab3"),
                FragmentTab3.class, null);
    }

    @Override
    public void onTimePicked(Calendar time) {
        // TODO Auto-generated method stub
        fragmentTab1.onTimePicked(time);
    }

}

Exception Line:

 textTime.setText(DateFormat.format("HH:mm a", time));

New LOG:

02-15 04:18:40.149: D/dalvikvm(1469): GC_FOR_ALLOC freed <1K, 4% free 5141K/5324K, paused 42ms, total 42ms
02-15 04:18:40.349: I/Choreographer(1469): Skipped 126 frames!  The application may be doing too much work on its main thread.
02-15 04:18:40.939: I/Choreographer(1469): Skipped 46 frames!  The application may be doing too much work on its main thread.
02-15 04:18:49.669: I/onTimePicked >>>(1469): 08:25 AM
02-15 04:18:49.669: D/AndroidRuntime(1469): Shutting down VM
02-15 04:18:49.729: W/dalvikvm(1469): threadid=1: thread exiting with uncaught exception (group=0xb1a94ba8)
02-15 04:18:49.739: E/AndroidRuntime(1469): FATAL EXCEPTION: main
02-15 04:18:49.739: E/AndroidRuntime(1469): Process: com.example.datetimeabs, PID: 1469
02-15 04:18:49.739: E/AndroidRuntime(1469): java.lang.NullPointerException
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.example.datetimeabs.FragmentTab1.onTimePicked(FragmentTab1.java:73)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.example.datetimeabs.MainActivity.onTimePicked(MainActivity.java:47)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.example.datetimeabs.TimePickerFragment.onTimeSet(TimePickerFragment.java:52)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at android.app.TimePickerDialog.tryNotifyTimeSet(TimePickerDialog.java:130)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at android.app.TimePickerDialog.onClick(TimePickerDialog.java:115)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at android.os.Looper.loop(Looper.java:136)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at android.app.ActivityThread.main(ActivityThread.java:5017)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invokeNative(Native Method)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invoke(Method.java:515)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-15 04:18:49.739: E/AndroidRuntime(1469):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Implementing TimePicker Dialog in Fragment using DialogFragment and getting ClassCastException

The exception is telling you that MainActivity needs to implement the TimePickerFragment$TimePickedListener interface and provide an implementation of the onTimePicked() method.

New LOG:

That exception appears because you're not properly interacting with your fragments, in the onTimePicked callback you call the onTimePicked(time) of a wrong first fragment tab. That fragment isn't the fragment that the FragmentTabHost uses for its first tab, it's just a fragment that you manually instantiated(with fragmentTab1 = new FragmentTab1();). This manually instantiated fragment isn't attached to the Activity and doesn't have a view because none of its callback were called.

To access the proper fragment use the FragmentManager to first find it:

@Override
public void onTimePicked(Calendar time) {
    FragmentTab1 ft1 = (FragmentTab1) getSupportFragmentManager().findFragmentByTag("tab1");
    fragmentTab1.onTimePicked(time);
}

这篇关于TextView的NullPointerException异常实施片段TimePicker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆