0

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:追加できませんwindow-token android.app.LocalActivityManager $ LocalActivityRecord@40543360は無効です。あなたの活動は実行されていますか?

ただし、search_resultアクティビティのonCreateから1行のコメントを外すと、次のようになります。

new LoadSearches().execute();

クラッシュはありませんが、明らかに何も得られません。LoadSearches()はAsyncTaskであり、サーバーに出て検索文字列を実行し、返されたデータをonPostExecute()のListActivityに入力するという手間のかかる作業を行います。

ここでクラッシュする理由がよくわかりませんが、アクティビティを切り替えると通常はクラッシュしません。これにどのように取り組むべきですか?もっと良い方法はありますか?フラグメントについて少し読んだことがありますが、まだ何もしていません。

4

1 に答える 1

1

髪の毛をたくさん抜いた後、破片を使うことにしました。フラグメントとタブを使用するように既存のアプリを変換するのに役立つと思ったリソースは次のとおりです。

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/

また、アクティビティ間のパスデータにも問題がありました。インテント/バンドルを使用してアクティビティ間でデータを渡す方法は、実際には同じようには機能しませんが、わずかに変更しても機能します。

古い方法(Activity1からActivity2にデータを渡す):

アクティビティ1

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

アクティビティ2

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;     
}

これを使用して、フラグメントを使用する新しいメソッド:

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");

このすべての情報を1か所で見つけるのは困難だったので、これが誰かの助けになることを願っています。

于 2012-02-12T21:54:25.830 に答える