2

textField/button と TreeMenu (各要素にはチェックボックスが関連付けられています) 用とリスト用の 2 つのタブを持つ Android アプリケーションを構築しようとしています。私は ActionBarSherlock も使用しています。すでに 1 つのメイン アクティビティでプログラムを正常に記述していますが、この元のアクティビティを分割して、各タブに作成する必要がある 2 つの新しいフラグメント インスタンスに対応させる方法を理解するのに苦労しています。さらに、最初のタブにアイテムが追加されるたびに (チェック オフされているか、textField に追加されているかに関係なく)、2 番目のウィンドウのリストは更新を認識する必要があります。

アクションバーを作成するには、これを行うことができます...

ActionBar actionbar = getSupportActionBar();
actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionbar.setTitle("AppName");

タブを作成するには..

 ActionBar.Tab Frag1Tab = actionbar.newTab().setText("InputTab");
 ActionBar.Tab Frag2Tab = actionbar.newTab().setText("ListTab");

各タブの基礎となるフラグメントとそのリスナーを作成するには...

Fragment Fragment1 = new Fragment_1();
Fragment Fragment2 = new Fragment_2();
Frag1Tab.setTabListener(new MyTabsListener(Fragment1));
Frag2Tab.setTabListener(new MyTabsListener(Fragment2));

それらをアクション バーに追加するには...

actionbar.addTab(Frag1Tab);
actionbar.addTab(Frag2Tab);

これらはすべて MainActivity 内に表示されます。たとえば、ArrayList 変数を両方のフラグメントにアクセスできるようにしたいので、前述のように、リストを更新できます。私はあなたが提供できる助けを聞きたいです. Otto API がこのような目的でどのように機能するか興味がありますが、うるさいわけではありません!

4

5 に答える 5

2

一部の回答では、ArrayList をシングルトンに配置するという提案がありますが、それでは問題は本当に解決しませんか? もちろん、いつでも好きな場所からアクセスできますが、2 つの異なるフラグメント (どちらも arraylist を使用) を同期させておくのには役立ちません。

ArrayList を提案どおりにシングルトンに配置するか、MainActivity に配置することから始めます。これが完了すると、フラグメントを ArrayList のコンテンツと同期させるためのオプションが少なくとも 2 つあります。

  1. ArrayListを監視可能にし ( ObservableArrayList確認)、フラグメントに ArrayList の変更を監視させます

  2. イベント バス ( Ottoなど) を利用し、arraylist が変更されたときにシングルトンまたは MainActivity (ArrayList の配置場所に応じて) が更新イベントをバスにポストし、Fragments がイベントにサブスクライブするようにします。

于 2013-06-11T09:53:58.250 に答える
1

少し前に、ArrayList とその他のデータで同じ問題が発生しました。最終的に、アプリケーションを拡張し、すべてのグローバル データを保持し、アプリからどこからでもアクセスできるクラスを作成することにしました。例を挙げたいですか?

于 2013-06-11T09:40:46.780 に答える
1

シングルトン クラスは、問題の解決に役立つ可能性があります。

public class GlobalApp {
    private static GlobalApp instance = new GlobalApp();

    private GlobalApp() {}

    public static GlobalApp getInstance() {
        return instance;
    }

    public ArrayList < ClassName > varName = new ArrayList < ClassName > ();

}

次に、このようにクラスで使用します..

GlobalApp.getInstance().varName
于 2013-06-11T09:47:19.160 に答える
1

John が言ったように、複数のアクティビティでデータにアクセスしたい場合は、Application を拡張するクラスを作成するだけです。

import android.app.Application;

/**
 * Application class used to share data between activities.
 * @author Longeanie Christophe
 *
 */

public class MyApplication extends Application {


    //Put your class members here

    @Override
    public void onCreate() {
        //initialize what's needed here
    }

    //Getters and setters...
}

すべてのアクティビティで、この命令を使用してこのクラスとそのデータにアクセスできます。

MyApplication myApp = (MyApplication) getApplication();
于 2013-06-11T09:56:34.497 に答える
0

どうぞ: まず、必ず AndroidManifest で宣言してください:

<application
 android:name="com.example.main.ApplicationClass" 
 etc..>

<!-- other activities, services etc: -->

</application>

そしてあなたのクラス:

public class ApplicationClass extends Application {
private static ApplicationClass THIS = null;
ArrayList<String> list = new ArrayList<String>();

public void onCreate() {
  super.onCreate();

  THIS = this;
}

public static ApplicationClass getThisInstance() {
    return THIS;
}
}
于 2013-06-11T09:51:28.897 に答える