Невозможно запустить активность Ошибка с помощью вкладок - PullRequest
0 голосов
/ 12 февраля 2012

Я пытаюсь расширить свое приложение, добавив TabHost и несколько вкладок для навигации по дополнительным функциям.Текущее приложение в основном ищет базу данных.Текущий рабочий процесс приложения:

  1. Приложение загружается на экран входа в систему
  2. Пользователь входит в систему
  3. Пользователь получает форму поиска и вводит данные, нажимает «поиск»
  4. Поиск загружает список результатов деятельности ...

С новыми вкладками появилась отдельная вкладка для поиска.Я хочу, чтобы все действия по поиску оставались в этой группе вкладок.Итак, я создал группу действий, чтобы обработать все это:

public class searchGroup extends ActivityGroup {        
    public static searchGroup group;
    private ArrayList<View> history;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          this.history = new ArrayList<View>();
          group = this;      
          View view = getLocalActivityManager().startActivity("search", new Intent(this,search.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
          replaceView(view);
       }

    public void replaceView(View v) {               
        history.add(v);                
        setContentView(v);
    }

    public void back() {
        if(history.size() > 0) {
            history.remove(history.size()-1);
            setContentView(history.get(history.size()-1));
        }else {
            finish();
        }
    }

   @Override
    public void onBackPressed() {
       searchGroup.group.back();
        return;
    }
}

В моей поисковой кнопке поиска onClickListener:

view = searchGroup.group.getLocalActivityManager().startActivity("search_results",new Intent(search.this, search_results.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
searchGroup.group.replaceView(view);

Вот где я получаю сбой:

02-11 13: 43: 49.481: E / AndroidRuntime (1165): java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.myApp / com.myApp.search_results}: android.view.WindowManager $ BadTokenException: невозможно добавить окно - токен android.app.LocalActivityManager$LocalActivityRecord@40543360 недопустим;ваша активность запущена?

Однако, если я раскомментирую строку из onCreate действия search_result:

new LoadSearches().execute();

нет сбоя, но я ничего не получаю, очевидно.LoadSearches () - это AsyncTask, который выполняет тяжелую работу: выход на сервер и запуск строки поиска, а затем заполнение возвращаемых данных в ListActivity в onPostExecute ().

Я не совсем понимаю, почему егосбой здесь и не обычно, когда я переключаю деятельность.Как я должен заняться этим?Есть ли способ лучше?Я немного прочитал о Фрагментах, но пока ничего с ним не сделал.

1 Ответ

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

Я решил, после долгих потягиваний, пойти с осколками.Некоторые ресурсы, которые я нашел полезными для преобразования моего существующего приложения в использование Фрагментов и вкладок:

Фрагменты в Android 2.2.1, 2.3, 2.0.Возможно ли это?

http://www.e -nature.ch / tech /? P = 55

http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

Я такжебыла проблема с данными о пропусках между моими действиями.Способ передачи данных между действиями с использованием намерения / связки на самом деле не работает одинаково, но может немного изменяться и все еще работать.

Старый способ (передача данных из действия 1 в действие 2):

Activity1

Intent myIntent = new Intent(search.this, search_results.class);
Bundle b = new Bundle();
b.putString("SEARCHSTRING", strSearch);
myIntent.putExtras(b);
startActivityForResult(myIntent, 0);

Activity2

Bundle b = getIntent().getExtras();
strSearch = b.getString("SEARCHSTRING");

Используя фрагменты, мне пришлось создать инициализатор для Activity2:

public search_results newInstance(String strSearch){
  search_results f = new search_results();
  Bundle b = new Bundle();
  b.putString("SEARCHSTRING", strSearch);
  f.setArguments(b);        
  return f;     
}

, используя этот новый метод с использованием Fragments:

Avtivity1

Fragment newFragment = new search_results().newInstance(strSearch);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.realtabcontent, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();  

Activity2 (onCreateView)

Bundle b = getArguments();
strSearch = b.getString("SEARCHSTRING");

Надеюсь, это кому-нибудь поможет, так как мне было сложно найти всю эту информацию в одном месте.

...