Android:TabActivity/TabHost with ActivityGroup:从自定义Listview上的单击按钮创建首选项活动对话框和对话框时出错
我在这个网站上用ActivityGroup实现了一个TabActivity(TabHost) 我有两个关于实现这个的问题 第一个问题,使用带PreferenceActivity的TabActivity,单击首选项以创建首选项对话框时出错 08-10 21:55:35.919:E/AndroidRuntime(1415):android.view.WindowManager$BadTokenException:无法添加窗口--标记android.app.LocalActivityManager$LocalActivityRecord@405296f0无效;你的活动正在进行吗 我找到了一个解决方案,我应该在代码中使用“getParent()”而不是“getApplicationContext()”或“this”,但我不知道在哪里/如何做?我不知道如何使用我的PreferenceActivity执行“setContext(getParent())”之类的操作 我有一个与此完全相同的问题: 这是我的密码:Android:TabActivity/TabHost with ActivityGroup:从自定义Listview上的单击按钮创建首选项活动对话框和对话框时出错,android,android-tabhost,android-preferences,activitygroup,android-tabactivity,Android,Android Tabhost,Android Preferences,Activitygroup,Android Tabactivity,我在这个网站上用ActivityGroup实现了一个TabActivity(TabHost) 我有两个关于实现这个的问题 第一个问题,使用带PreferenceActivity的TabActivity,单击首选项以创建首选项对话框时出错 08-10 21:55:35.919:E/AndroidRuntime(1415):android.view.WindowManager$BadTokenException:无法添加窗口--标记android.app.LocalActivityManager$L
public class MoreUserProfile extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.more_userprofile);
}
public class ActivityListviewAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context context;
private ArrayList<Activities> listData = new ArrayList<Activities>();
public ActivityListviewAdapter(Context context,ArrayList<Activities> listData,) {
// TODO Auto-generated constructor stub
super();
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.listData = listData;
}
public int getCount() {
// TODO Auto-generated method stub
return listData.size(); //ส่งขนาดของ List ที่เก็บข้อมุลอยู่
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ActivityRowList activitylist;
if(convertView == null){
convertView = mInflater.inflate(R.layout.more_customizedactivity_customlistview, null);
activitylist = new ActivityRowList();
activitylist.ActivityName = (TextView) convertView.findViewById(R.id.TextView_More_Customizedactivity_Customlistview_ActivityName);
activitylist.ActivityDetail = (TextView) convertView.findViewById(R.id.TextView_More_Customizedactivity_Customlistview_ActivityDetail);
activitylist.ActivityType = (ImageView) convertView.findViewById(R.id.ImageView_Activity_ShowallActivity_Customlistview);
activitylist.EditCustomizedButton = (Button) convertView.findViewById(R.id.Button_More_Customizedactivity_Customlistview_Edit);
activitylist.DeleteCustomizedButton =(Button)convertView.findViewById(R.id.Button_More_Customizedactivity_Customlistview_Delete);
convertView.setTag(activitylist);
}else{
activitylist = (ActivityRowList) convertView.getTag();
}
activitylist.ActivityName.setText(listData.get(position).getActivityName());
activitylist.ActivityDetail.setText("MET: "+listData.get(position).getActivityMET().toString());
activitylist.ActivityType.setImageResource(R.drawable.activity_type_customized);
activitylist.EditCustomizedButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
editNewActivityDialog(listData.get(position).getActivityName(), listData.get(position).getActivityMET(),position);
}
});
activitylist.DeleteCustomizedButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
confirmDeleteCustomizedDialog(listData.get(position).getActivityName(),listData.get(position));
}
});
return convertView;
}
private void confirmDeleteCustomizedDialog(final String ActivityNameInput,final Activities listDataposition){
// TODO Auto-generated method stub
AlertDialog alertDialog = new AlertDialog.Builder(mInflater.getContext()).create();
alertDialog.setTitle("Confirm Delete");
alertDialog.setMessage("Do you want to delete:\"" + ActivityNameInput +"\"" );
alertDialog.setIcon(R.drawable.ic_launcher);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,"Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Some codes here
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"Cancel",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
alertDialog.show();
}
private void editNewActivityDialog(final String ActivityNameBefore, float ActivityMETBefore,final int ListPosition) {
// TODO Auto-generated method stub
final Dialog dialog = new Dialog(mInflater.getContext());
dialog.setContentView(R.layout.more_customizedactivity_dialog_addnew);
final EditText EditText_Addnewactivity_Dialog_ActivityName=(EditText)dialog.findViewById(R.id.EditText_More_Customizedactivity_Addnewactivity_Dialog_ActivityName);
final EditText EditText_Addnewactivity_Dialog_ActivityMET=(EditText)dialog.findViewById(R.id.EditText_More_Customizedactivity_Addnewactivity_Dialog_ActivityMET);
final Button Button_More_Customizedactivity_Addnewactivity_Dialog_OK=(Button)dialog.findViewById(R.id.Button_More_Customizedactivity_Addnewactivity_Dialog_OK);
final Button Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel=(Button)dialog.findViewById(R.id.Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel);
dialog.setTitle("Edit Activity by User");
EditText_Addnewactivity_Dialog_ActivityName.setText(ActivityNameBefore);
EditText_Addnewactivity_Dialog_ActivityMET.setText(ActivityMETBefore+"");
dialog.show();
Button_More_Customizedactivity_Addnewactivity_Dialog_OK.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// Some codes here
});
Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
}
}
在我看来,我认为应该在对话框类的onCreateDialogView()中实现一些东西,因为android在创建对话框时调用了这个方法。我尽力了,但我解决不了我的问题
public class MoreUserProfileDateOfBirthDialog extends DialogPreference {
LinearLayout layout;
SharedPreferences.Editor editor;
public MoreUserProfileDateOfBirthDialog(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
setDialogLayoutResource(R.layout.more_userprofile_dialog_dateofbirth);
}
@Override
protected View onCreateDialogView() {
// TODO Auto-generated method stub
// I think I should implement some code here.
//Activity parent = new Activity();
//LayoutInflater inflater = (LayoutInflater) parent.getLayoutInflater();
//layout = (LinearLayout) inflater.inflate(R.layout.more_userprofile_dialog_dateofbirth, null);
}
protected void onBindDialogView(View view) {
layout = (LinearLayout) view.findViewById(R.id.more_userprofile_dialog_dateofbirth_linearlayout);
SharedPreferences pref = getSharedPreferences();
int day = pref.getInt("dayOfBirthday", 1);
int month = pref.getInt("monthOfBirthday", 1);
int year = pref.getInt("yearOfBirthday", 2000);
DatePicker dp = (DatePicker) view.findViewById(R.id.more_userprofile_dialog_choosedateofbirth_datePicker);
dp.init(year, month-1, day, onDateChangedListener);
layout.removeAllViews();
layout.addView(dp);
super.onBindDialogView(view);
}
DatePicker.OnDateChangedListener onDateChangedListener = new OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
editor = getEditor();
editor.putInt("dayOfBirthday", view.getDayOfMonth());
editor.putInt("monthOfBirthday", view.getMonth()+1);
editor.putInt("yearOfBirthday", view.getYear());
}
};
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
super.onClick(dialog, which);
if(which==DialogInterface.BUTTON_NEGATIVE){
dialog.dismiss();
}
if(which==DialogInterface.BUTTON_POSITIVE){
editor.commit();
}
}
}
第二个问题,与上文类似,但这次是关于带有ListView适配器的TabActivity(用于自定义ListView)。在每个自定义Listview项上有2个按钮,“编辑”和“删除”。当我点击其中一个按钮时,对话框出现。但在我将TabActivity应用于我的应用程序之后,按下这些按钮时出现了一个错误。错误代码与上述类似:
08-10 22:13:56.643:E/AndroidRuntime(1427):android.view.WindowManager$BadTokenException:无法添加窗口--标记android.app.LocalActivityManager$LocalActivityRecord@40526c50无效;你的活动正在进行吗
这是我的密码:
public class MoreUserProfile extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.more_userprofile);
}
public class ActivityListviewAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context context;
private ArrayList<Activities> listData = new ArrayList<Activities>();
public ActivityListviewAdapter(Context context,ArrayList<Activities> listData,) {
// TODO Auto-generated constructor stub
super();
this.context = context;
this.mInflater = LayoutInflater.from(context);
this.listData = listData;
}
public int getCount() {
// TODO Auto-generated method stub
return listData.size(); //ส่งขนาดของ List ที่เก็บข้อมุลอยู่
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ActivityRowList activitylist;
if(convertView == null){
convertView = mInflater.inflate(R.layout.more_customizedactivity_customlistview, null);
activitylist = new ActivityRowList();
activitylist.ActivityName = (TextView) convertView.findViewById(R.id.TextView_More_Customizedactivity_Customlistview_ActivityName);
activitylist.ActivityDetail = (TextView) convertView.findViewById(R.id.TextView_More_Customizedactivity_Customlistview_ActivityDetail);
activitylist.ActivityType = (ImageView) convertView.findViewById(R.id.ImageView_Activity_ShowallActivity_Customlistview);
activitylist.EditCustomizedButton = (Button) convertView.findViewById(R.id.Button_More_Customizedactivity_Customlistview_Edit);
activitylist.DeleteCustomizedButton =(Button)convertView.findViewById(R.id.Button_More_Customizedactivity_Customlistview_Delete);
convertView.setTag(activitylist);
}else{
activitylist = (ActivityRowList) convertView.getTag();
}
activitylist.ActivityName.setText(listData.get(position).getActivityName());
activitylist.ActivityDetail.setText("MET: "+listData.get(position).getActivityMET().toString());
activitylist.ActivityType.setImageResource(R.drawable.activity_type_customized);
activitylist.EditCustomizedButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
editNewActivityDialog(listData.get(position).getActivityName(), listData.get(position).getActivityMET(),position);
}
});
activitylist.DeleteCustomizedButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
confirmDeleteCustomizedDialog(listData.get(position).getActivityName(),listData.get(position));
}
});
return convertView;
}
private void confirmDeleteCustomizedDialog(final String ActivityNameInput,final Activities listDataposition){
// TODO Auto-generated method stub
AlertDialog alertDialog = new AlertDialog.Builder(mInflater.getContext()).create();
alertDialog.setTitle("Confirm Delete");
alertDialog.setMessage("Do you want to delete:\"" + ActivityNameInput +"\"" );
alertDialog.setIcon(R.drawable.ic_launcher);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,"Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Some codes here
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"Cancel",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
alertDialog.show();
}
private void editNewActivityDialog(final String ActivityNameBefore, float ActivityMETBefore,final int ListPosition) {
// TODO Auto-generated method stub
final Dialog dialog = new Dialog(mInflater.getContext());
dialog.setContentView(R.layout.more_customizedactivity_dialog_addnew);
final EditText EditText_Addnewactivity_Dialog_ActivityName=(EditText)dialog.findViewById(R.id.EditText_More_Customizedactivity_Addnewactivity_Dialog_ActivityName);
final EditText EditText_Addnewactivity_Dialog_ActivityMET=(EditText)dialog.findViewById(R.id.EditText_More_Customizedactivity_Addnewactivity_Dialog_ActivityMET);
final Button Button_More_Customizedactivity_Addnewactivity_Dialog_OK=(Button)dialog.findViewById(R.id.Button_More_Customizedactivity_Addnewactivity_Dialog_OK);
final Button Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel=(Button)dialog.findViewById(R.id.Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel);
dialog.setTitle("Edit Activity by User");
EditText_Addnewactivity_Dialog_ActivityName.setText(ActivityNameBefore);
EditText_Addnewactivity_Dialog_ActivityMET.setText(ActivityMETBefore+"");
dialog.show();
Button_More_Customizedactivity_Addnewactivity_Dialog_OK.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// Some codes here
});
Button_More_Customizedactivity_Addnewactivity_Dialog_Cancel.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
dialog.dismiss();
}
});
}
}
公共类ActivityListviewAdapter扩展了BaseAdapter{
私人停车场;
私人语境;
私有ArrayList listData=新ArrayList();
公共活动ListViewAdapter(上下文上下文、ArrayList listData){
//TODO自动生成的构造函数存根
超级();
this.context=上下文;
this.mInflater=LayoutInflater.from(上下文);
this.listData=listData;
}
public int getCount(){
//TODO自动生成的方法存根
返回listData.size()//ส่งขนาดของ 列表ที่เก็บข้อมุลอยู่
}
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回位置;
}
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终活动列表;
if(convertView==null){
convertView=mInflater.充气(R.layout.more\u customizedactivity\u customlistview,空);
activitylist=新建ActivityRowList();
activitylist.ActivityName=(TextView)convertView.findViewById(R.id.TextView\u More\u Customizedactivity\u Customlistview\u ActivityName);
activitylist.ActivityDetail=(TextView)convertView.findViewById(R.id.TextView\u More\u Customizedactivity\u Customlistview\u ActivityDetail);
activitylist.ActivityType=(ImageView)convertView.findViewById(R.id.ImageView\u Activity\u ShowallActivity\u Customlistview);
activitylist.EditCustomizedButton=(Button)convertView.findViewById(R.id.Button\u More\u Customizedactivity\u Customlistview\u Edit);
activitylist.DeleteCustomizedButton=(Button)convertView.findViewById(R.id.Button\u More\u Customizedactivity\u Customlistview\u Delete);
setTag(activitylist);
}否则{
activitylist=(ActivityRowList)convertView.getTag();
}
activitylist.ActivityName.setText(listData.get(position.getActivityName());
activitylist.ActivityDetail.setText(“MET:+listData.get(position.GetActivitySet().toString());
activitylist.ActivityType.setImageResource(R.drawable.activity\u type\u定制);
activitylist.EditCustomizedButton.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
editNewActivityDialog(listData.get(position).getActivityName(),listData.get(position).GetActivitySet(),position);
}
});
activitylist.DeleteCustomizedButton.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
confirmDeleteCustomizedDialog(listData.get(position).getActivityName(),listData.get(position));
}
});
返回视图;
}
私有void confirmDeleteCustomizedDialog(最终字符串ActivityNameInput,最终活动列表DataPosition){
//TODO自动生成的方法存根
AlertDialog AlertDialog=新建AlertDialog.Builder(mInflater.getContext()).create();
alertDialog.setTitle(“确认删除”);
alertDialog.setMessage(“是否要删除:\”“+ActivityNameInput+”\”);
alertDialog.setIcon(R.drawable.ic_启动器);
alertDialog.setButton(DialogInterface.BUTTON_肯定,“确认”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
//这里有一些代码
});
alertDialog.setButton(DialogInterface.BUTTON_否定,“取消”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
//TODO自动生成的方法存根
dialog.dismise();
}
});
alertDialog.show();
}
私有void editNewActivityDialog(最终字符串ActivityNameBefore、浮点ActivityMETBefore、最终整数列表位置){
//TODO自动生成的方法存根
最终对话框=新对话框(mInflater.getContext());
dialog.set