【问题标题】:Communicative Between Fragments on AndroidAndroid 上的 Fragment 之间的通信
【发布时间】:2013-06-11 17:56:34
【问题描述】:

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

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

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 如何处理这样的事情,但我并不挑剔!

【问题讨论】:

    标签: android android-fragments actionbarsherlock otto


    【解决方案1】:

    在某些答案中,建议将 ArrayList 放在单例中,但这并不能真正解决您的问题,不是吗?当然,您可以从任何您喜欢的地方访问它,但这并不能帮助您保持两个不同的片段(都使用 arraylist)同步。

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

    1. 创建 ArrayList Observable(检查 ObservableArrayList)并让 Fragments Observe ArrayList 进行更改。

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

    【讨论】:

    • Otto 看起来很值得,但遗憾的是我还没有掌握它。感谢您的建议
    • 你真的应该试试 Otto。如果您对 Otto 有疑问,请发布另一个问题。只需几行代码即可启动并运行。
    【解决方案2】:

    单例类可以帮助解决您的问题。

    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
    

    【讨论】:

      【解决方案3】:

      不久前,我在 ArrayList 和其他数据方面遇到了同样的问题。最后,我决定创建一个扩展应用程序的类,它包含所有全局数据,并且可以从应用程序的任何地方访问。你要和榜样吗?

      【讨论】:

      • 好的,非常感谢。
      【解决方案4】:

      正如约翰所说,当你想在多个活动中访问数据时,只需创建一个扩展应用程序的类:

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

      【讨论】:

      • 我的印象是我使用了一个“主要”活动和四个片段。每个片段都需要有自己的活动吗?
      • 视情况而定,但一般来说,如果没有关系......那么每个活动都会包含一个片段。
      【解决方案5】:

      给你: 首先确保你在你的 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;
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多