2

我正在尝试构建一个具有两个选项卡的 Android 应用程序,一个用于 textField/button 和 TreeMenu(其中每个元素都有一个与之关联的复选框),另一个用于列表。我也在使用 ActionBarSherlock。我已经在一个主要活动中成功编写了程序,但是很难弄清楚如何划分这个原始活动以对应于我需要为每个选项卡创建的两个新片段实例。此外,每次在第一个选项卡中添加项目时(无论是被选中还是添加到文本字段),第二个窗口中的列表都应该识别更新。

要构建操作栏,我可以这样做......

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 放在单例中,但这并不能真正解决您的问题,对吗?当然,您可以从任何您喜欢的地方访问它,但这并不能帮助您保持两个不同的片段(都使用 arraylist)同步。

首先按照建议或在 MainActivity 中将 ArrayList 放入单例中。完成后,您至少有两个选项可以使片段与 ArrayList 的内容保持同步:

  1. 使 ArrayList可观察(检查ObservableArrayList)并让 Fragments观察ArrayList 的变化。

  2. 利用事件总线(如Otto)并让单例或 MainActivity(取决于放置 ArrayList 的位置)在数组列表更改时在总线上发布更新事件并让片段订阅事件。

于 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 回答