在android中创建DatePickerDialog时出现异常

发布于 2024-12-10 06:18:17 字数 10959 浏览 0 评论 0原文

这是例外..

10-15 18:15:00.031: ERROR/AndroidRuntime(9202): FATAL EXCEPTION: main
10-15 18:15:00.031: ERROR/AndroidRuntime(9202): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@405727b0 is not valid; is your activity running?
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.ViewRoot.setView(ViewRoot.java:527)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Dialog.show(Dialog.java:241)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.DatePickerDialog.show(DatePickerDialog.java:132)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Activity.showDialog(Activity.java:2566)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Activity.showDialog(Activity.java:2524)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.uis.DaysActivity$4.onClick(DaysActivity.java:82)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.View.performClick(View.java:2485)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.View$PerformClick.run(View.java:9080)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Handler.handleCallback(Handler.java:587)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Looper.loop(Looper.java:130)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at java.lang.reflect.Method.invokeNative(Native Method)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at java.lang.reflect.Method.invoke(Method.java:507)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at dalvik.system.NativeStart.main(Native Method)

这是创建 DatePickDoilog 的代码

编辑

活动的完整代码

package com.android.uis;

import java.util.ArrayList;
import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; 
import com.android.classes.Appointment;
import com.android.database.DatabaseHelper;
import com.android.networkservices.TimeTableWebService;

public class DaysActivity extends Activity {

    private ListView lvDay;
    private Button bUpdateTimeTable,bChangeDate;
    private ArrayList<String> items;
    private ArrayList<Appointment> appointments;
    private EfficientAdapter adap;
    private int mYear;
    private int mMonth;
    private int mDay;
    static final int DATE_DIALOG_ID = 0;
    Activity a;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.day_layout);

        lvDay = (ListView)this.findViewById(R.id.lvDay);
        bUpdateTimeTable = (Button)this.findViewById(R.id.bUpdateTimeTable);    
        bChangeDate = (Button)this.findViewById(R.id.bChangeDate);    
        items = new ArrayList<String>();
        appointments = new ArrayList<Appointment>();

        lvDay.setClickable(true);
        bindList();// to bind list items

        a= this;

        lvDay.setOnItemClickListener(new OnItemClickListener(){

            public void onItemClick(AdapterView<?> parent, View view, int position,long id) { }

        });

        bUpdateTimeTable.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {

                DatabaseHelper db = new DatabaseHelper(getApplicationContext());
                // At first delete the previous data then retrieve the new one 
                    db.deteleAllAppointments();
                        appointments.clear();
                                items.clear();
                    TimeTableWebService ttws = new TimeTableWebService();
                                ttws.execute("http://mmu4bader.com/AppointmentJSon/getAppointments1");  
                        ttws.getResult(getApplicationContext());
                    bindList();
            }
        });

        bChangeDate.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {

                a.showDialog(DATE_DIALOG_ID);
                            Toast.makeText(getApplicationContext(), "date", Toast.LENGTH_SHORT).show();
            }
        });

        // get the current date
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);    
        mMonth = c.get(Calendar.MONTH);    
        mDay = c.get(Calendar.DAY_OF_MONTH); 

        // display the current date (this method is below)    
        updateDisplay();    
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener =

            new DatePickerDialog.OnDateSetListener() { 

                public void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;    
                    mDay = dayOfMonth;    
                    updateDisplay();    
                }   
    };

    @Override
    protected Dialog onCreateDialog(int id) {

        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,mDateSetListener,mYear, mMonth, mDay);
        }
        return null;    
    }   

    private void updateDisplay() {

    }

    private void bindList(){

        DatabaseHelper db = new DatabaseHelper(getApplicationContext());
            appointments = db.getAllAppointments();
            Log.d("App from DB",appointments.size()+"");
            for(int i=0;i<appointments.size();i++)
        {
            items.add(String.valueOf(appointments.get(i).mTitle));
            Log.d("title from db",String.valueOf(appointments.get(i).mTitle));
        }    
        adap = new EfficientAdapter(this);    
        adap.notifyDataSetChanged();    
        lvDay.setAdapter(adap);    
    }

    public void onResume() {    
        super.onResume();
    }       

    public class EfficientAdapter extends BaseAdapter implements Filterable{

        LayoutInflater inflater;
            Context context;

        public EfficientAdapter(Context context){
                inflater = LayoutInflater.from(context);
                this.context = context;
            }
            public int getCount() {
                   return items.size();
            }
        public Object getItem(int position) {    
            return items.get(position);    
        }
        public long getItemId(int position) {
                    return 0;    
        }    
        public View getView(final int position, View convertView, ViewGroup parent) {    
            ViewHolder holder;    
            if(convertView == null){    
                convertView = inflater.inflate(R.layout.adaptor_timetable_content, null);
                            holder = new ViewHolder();
                holder.textLineTitle = (TextView)convertView.findViewById(R.id.textLineTitle);
                holder.textLineTime = (TextView)convertView.findViewById(R.id.textLineTime);

                convertView.setOnClickListener(new OnClickListener() {

                    private int pos = position;
                    public void onClick(View v) {
                        /*  Intent i = new    Intent(context,RoutingMapActivity.class);
                                             i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                         i.putExtra("Department", depts.get(pos).toBunlde());
    getApplicationContext().startActivity(i);  
                    }
                        });

                convertView.setTag(holder);
            }
                    else{
                holder = (ViewHolder)convertView.getTag();
            }

            // Bind the data efficiently with the holder.

            try{
                holder.textLineTitle.setText(String.valueOf(appointments.get(position).mTitle)); holder.textLineTime.setText(String.valueOf(appointments.get(position).mStartDate));
            }
                    catch(Exception ex){
            }
                return convertView;    
        }    
        public Filter getFilter() {
                    return null;    
        }    
    }    
    static class ViewHolder {    
        TextView textLineTitle;    
        TextView textLineTime;    
    }
}

day_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:weightSum="1"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:weightSum="1"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
<Button 
    android:layout_width="wrap_content"
    android:layout_weight="0.5" 
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="@string/bChangeDate" 
    android:id="@+id/bChangeDate"></Button>
<Button 
    android:layout_width="wrap_content"
    android:layout_weight="0.5" 
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="@string/btnUpdateTimeTable" 
    android:id="@+id/bUpdateTimeTable"></Button>
</LinearLayout>
 <ListView 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:id="@+id/lvDay"></ListView>

</LinearLayout>

this is the exception ..

10-15 18:15:00.031: ERROR/AndroidRuntime(9202): FATAL EXCEPTION: main
10-15 18:15:00.031: ERROR/AndroidRuntime(9202): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@405727b0 is not valid; is your activity running?
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.ViewRoot.setView(ViewRoot.java:527)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Dialog.show(Dialog.java:241)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.DatePickerDialog.show(DatePickerDialog.java:132)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Activity.showDialog(Activity.java:2566)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.Activity.showDialog(Activity.java:2524)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.uis.DaysActivity$4.onClick(DaysActivity.java:82)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.View.performClick(View.java:2485)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.view.View$PerformClick.run(View.java:9080)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Handler.handleCallback(Handler.java:587)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.os.Looper.loop(Looper.java:130)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at java.lang.reflect.Method.invokeNative(Native Method)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at java.lang.reflect.Method.invoke(Method.java:507)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-15 18:15:00.031: ERROR/AndroidRuntime(9202):     at dalvik.system.NativeStart.main(Native Method)

and here is the code for creating the DatePickDoilog

edit

full code of the activity

package com.android.uis;

import java.util.ArrayList;
import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; 
import com.android.classes.Appointment;
import com.android.database.DatabaseHelper;
import com.android.networkservices.TimeTableWebService;

public class DaysActivity extends Activity {

    private ListView lvDay;
    private Button bUpdateTimeTable,bChangeDate;
    private ArrayList<String> items;
    private ArrayList<Appointment> appointments;
    private EfficientAdapter adap;
    private int mYear;
    private int mMonth;
    private int mDay;
    static final int DATE_DIALOG_ID = 0;
    Activity a;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.day_layout);

        lvDay = (ListView)this.findViewById(R.id.lvDay);
        bUpdateTimeTable = (Button)this.findViewById(R.id.bUpdateTimeTable);    
        bChangeDate = (Button)this.findViewById(R.id.bChangeDate);    
        items = new ArrayList<String>();
        appointments = new ArrayList<Appointment>();

        lvDay.setClickable(true);
        bindList();// to bind list items

        a= this;

        lvDay.setOnItemClickListener(new OnItemClickListener(){

            public void onItemClick(AdapterView<?> parent, View view, int position,long id) { }

        });

        bUpdateTimeTable.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {

                DatabaseHelper db = new DatabaseHelper(getApplicationContext());
                // At first delete the previous data then retrieve the new one 
                    db.deteleAllAppointments();
                        appointments.clear();
                                items.clear();
                    TimeTableWebService ttws = new TimeTableWebService();
                                ttws.execute("http://mmu4bader.com/AppointmentJSon/getAppointments1");  
                        ttws.getResult(getApplicationContext());
                    bindList();
            }
        });

        bChangeDate.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {

                a.showDialog(DATE_DIALOG_ID);
                            Toast.makeText(getApplicationContext(), "date", Toast.LENGTH_SHORT).show();
            }
        });

        // get the current date
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);    
        mMonth = c.get(Calendar.MONTH);    
        mDay = c.get(Calendar.DAY_OF_MONTH); 

        // display the current date (this method is below)    
        updateDisplay();    
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener =

            new DatePickerDialog.OnDateSetListener() { 

                public void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;    
                    mDay = dayOfMonth;    
                    updateDisplay();    
                }   
    };

    @Override
    protected Dialog onCreateDialog(int id) {

        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,mDateSetListener,mYear, mMonth, mDay);
        }
        return null;    
    }   

    private void updateDisplay() {

    }

    private void bindList(){

        DatabaseHelper db = new DatabaseHelper(getApplicationContext());
            appointments = db.getAllAppointments();
            Log.d("App from DB",appointments.size()+"");
            for(int i=0;i<appointments.size();i++)
        {
            items.add(String.valueOf(appointments.get(i).mTitle));
            Log.d("title from db",String.valueOf(appointments.get(i).mTitle));
        }    
        adap = new EfficientAdapter(this);    
        adap.notifyDataSetChanged();    
        lvDay.setAdapter(adap);    
    }

    public void onResume() {    
        super.onResume();
    }       

    public class EfficientAdapter extends BaseAdapter implements Filterable{

        LayoutInflater inflater;
            Context context;

        public EfficientAdapter(Context context){
                inflater = LayoutInflater.from(context);
                this.context = context;
            }
            public int getCount() {
                   return items.size();
            }
        public Object getItem(int position) {    
            return items.get(position);    
        }
        public long getItemId(int position) {
                    return 0;    
        }    
        public View getView(final int position, View convertView, ViewGroup parent) {    
            ViewHolder holder;    
            if(convertView == null){    
                convertView = inflater.inflate(R.layout.adaptor_timetable_content, null);
                            holder = new ViewHolder();
                holder.textLineTitle = (TextView)convertView.findViewById(R.id.textLineTitle);
                holder.textLineTime = (TextView)convertView.findViewById(R.id.textLineTime);

                convertView.setOnClickListener(new OnClickListener() {

                    private int pos = position;
                    public void onClick(View v) {
                        /*  Intent i = new    Intent(context,RoutingMapActivity.class);
                                             i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                         i.putExtra("Department", depts.get(pos).toBunlde());
    getApplicationContext().startActivity(i);  
                    }
                        });

                convertView.setTag(holder);
            }
                    else{
                holder = (ViewHolder)convertView.getTag();
            }

            // Bind the data efficiently with the holder.

            try{
                holder.textLineTitle.setText(String.valueOf(appointments.get(position).mTitle)); holder.textLineTime.setText(String.valueOf(appointments.get(position).mStartDate));
            }
                    catch(Exception ex){
            }
                return convertView;    
        }    
        public Filter getFilter() {
                    return null;    
        }    
    }    
    static class ViewHolder {    
        TextView textLineTitle;    
        TextView textLineTime;    
    }
}

day_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:weightSum="1"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:weightSum="1"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
<Button 
    android:layout_width="wrap_content"
    android:layout_weight="0.5" 
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="@string/bChangeDate" 
    android:id="@+id/bChangeDate"></Button>
<Button 
    android:layout_width="wrap_content"
    android:layout_weight="0.5" 
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="@string/btnUpdateTimeTable" 
    android:id="@+id/bUpdateTimeTable"></Button>
</LinearLayout>
 <ListView 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:id="@+id/lvDay"></ListView>

</LinearLayout>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文