Нажмите на спиннер, чтобы получить WindowManager $ BadTokenException - PullRequest
3 голосов
/ 03 февраля 2012

Я использую Tabwidget, Tab реализован таким же образом, который показан в учебнике

"MainActivity -> Activity1 -> Activity2 (данный рисунок)" *

view for the current activity

Теперь нажатие на счетчик дает

 android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@44eb8748 is not valid; is your activity running?

Я пытался Ошибка Android Spinner: android.view.WindowManager $ BadTokenException: Невозможно добавить окно уже, ноэто не помогает мне

Я знаю, что что-то не так с контекстом , но я не могу понять, что

Слушай, мое намерение начинается DetailActivity

intent = new Intent(getParent(), DetailActivity.class);
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("SelectActivity", intent);

Мой код для DetailActivity приведенного ниже

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.package_detail);
        setUpViews();

        id = getIntent().getExtras().getInt("WEBSITE_ID");

        adapter = new KeywordAdapter(getApplicationContext(), id,
                getLNApplication().getKeyworddetail());
        listTags.setAdapter(adapter);

        spinneAdapter = new SpinnerListAdapter();
        spinnerList.setAdapter(spinneAdapter);
        spinnerList.setSelection(id, true);
        spinnerList
                .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    public void onItemSelected(AdapterView<?> parent,
                            View view, int position, long id) {

                        // txtHeader.setText(getLNApplication().getWebsiteList()
                        // .get(position).getName());
                        adapter.forceReload();
                        adapter = new KeywordAdapter(DetailActivity.this,
                                position, getLNApplication().getKeyworddetail());
                        listTags.setAdapter(adapter);
                    }

                    public void onNothingSelected(AdapterView<?> parent) {

                    }
                });

    }

код для SpinnerAdapter

public class SpinnerListAdapter extends BaseAdapter {

        private List<ClientDetail> siteList;

        public SpinnerListAdapter() {
            siteList = getLNApplication().getWebsiteList();
        }

        public void forceReload() {
            notifyDataSetChanged();

        }

        @Override
        public int getCount() {
            return siteList.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return siteList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;

//          LayoutInflater inflater = (LayoutInflater) context
//              .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//          LayoutInflater inflater = getLayoutInflater();

//          LayoutInflater inflater = LayoutInflater.from(DetailActivity.this.getParent());

            LayoutInflater inflater = LayoutInflater.from(DetailActivity.this.getParent());
                view = inflater.inflate(R.layout.spinner_item_display, null);
                TextView websiteName = (TextView) view.findViewById(R.id.spinnerItem);
            if (siteList.get(position).getName() != null) {
                websiteName.setText(siteList.get(position).getName());
                websiteName.setTextColor(0xFF000000);
            }
            return view;
        }

        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
            View view = convertView;

//          LayoutInflater inflater = (LayoutInflater) context
//                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//          LayoutInflater inflater = getLayoutInflater();

//          LayoutInflater inflater = LayoutInflater.from(DetailActivity.this.getParent());

            LayoutInflater inflater = LayoutInflater.from(DetailActivity.this.getParent());
                view = inflater.inflate(R.layout.spinner_dropdown_display, null);
                TextView websiteName = (TextView) view.findViewById(R.id.spinnerDropDownItem);
            if (siteList.get(position).getName() != null) {
                websiteName.setText(siteList.get(position).getName());
                websiteName.setTextColor(0xFF000000);
            }
            return view;
        }
    }

Я что-то не так делаю?

пожалуйста, помогите мне ... Большое вам спасибо

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

В активности вкладки, если вы предоставляете какое-либо диалоговое окно с предупреждением, тогда в этом случае вы установили контекст действия вкладки, а не текущий объект действия.

вместо

adapter = new KeywordAdapter(getApplicationContext(),id,getLNApplication().getKeyworddetail());
listTags.setAdapter(adapter);

используйте следующее

adapter = new KeywordAdapter(Tabs.ctx,id,getLNApplication().getKeyworddetail());
listTags.setAdapter(adapter);

где Tabs.ctx является контекстом активности вкладок и является статической переменной.

1 голос
/ 03 февраля 2012

pass

YourActivty.this.getParent()

как Context в Spinner.

Для получения дополнительной информации см. здесь и здесь

0 голосов
/ 07 мая 2013

В TabWidget также с помощью этого кода вы можете решить эту ошибку

View view = LayoutInflater.from(this.getParent()).inflate(R.layout.package_detail, null);
this.setContentView(view); 
...