【问题标题】:How to get data from two different fragments in tabs to main activity如何从选项卡中的两个不同片段获取数据到主要活动
【发布时间】:2016-09-13 09:02:52
【问题描述】:

我想知道如何从选项卡布局内的 2 个不同片段中获取数据。

例如:在此图像中,两个选项卡 tab1 和 tab2 都在编辑文本中存储了不同的值。

tab1 你好, tab2 hiiiiiii

我在主要活动中有一个可用的按钮,用于同时从两个选项卡中获取数据。

现在我的问题是当用户点击时如何同时从两个选项卡中获取数据

获取数据按钮

【问题讨论】:

    标签: android android-fragments android-tabs fragment-tab-host


    【解决方案1】:

    1.) 在活动中保留片段的引用。

     public class Activity extends AppCompatActivity  {
          private yourFargment frag1,frag2;
        }
    

    2.) 将对象引用放入AdaptergetItem() 中的引用变量中。

    @Override
    public Fragment getItem(int index) {
        switch (index) {
            case 0:
                frag1 = yourFargment.newInstance(index);
    //frag1 =new yourFargment (); can also be used
    
                return frag1;
            case 1:
                frag2 = yourFargment.newInstance(index);
                return frag2;
        }
        return null;
    }
    

    3.) 在您的 onClick 中,您可以简单地从 edittext 获取这些值。

    onClick(View..){
    String val1 = frag1.edittext1.getText().toString(); // Note: make your `edittext` public
    String val2 = frag2.edittext2.getText().toString();
    

    String val1 = frag1.getData();
    String val2 = frag2.getData();
    }
    

    其中getDatapublic 中的fragment 方法

        public class yourFragment..{
          public String getData(){
           return edittext.getText().toString();
           // Note: with this no need to make your `edittext` public 
        }
    }
    

    【讨论】:

      【解决方案2】:

      在您的活动中获取两个 Fragment 的成员对象..

      FirstFragment mFirstFragment;
      SecondFragment mSecondFragment;
      

      ViewPagerAdaptergetItem(int position) 方法中创建两者的实例。

          @Override
          public Fragment getItem(int position) {
              // instantiate the fragment for the given page.
      
              switch (position) {
              case 0:
                  if (null == mFirstFragment) {
                      mFirstFragment = FirstFragment.newInstance(); 
                  }
                  return mFirstFragment;
              case 1:
                  if( null == mSecondFragment ) {
                      mSecondFragment = SecondFragment.newInstance();
                  }
                  return mSecondFragment;         
              }   
      
              return null;
      
          }
      

      从活动中单击按钮时调用两个片段的getData方法。

      @Override
      public void onClick(View v) {
      
          switch (v.getId()) {
             case R.id.button1:
                   // Get data and use it as you want.
                   mFirstFragment.getData();
                   mSecondFragment.getData();
              break;
          }
      }
      

      【讨论】:

      • 如何在 getItem 中访问 mFirstFragment?它在不同的活动中声明
      • @rav 两个片段应该在同一个活动中。
      【解决方案3】:

      当您在选项卡中设置片段时,您拥有这些片段的 2 个对象。通过使用这些对象,您可以从片段中检索值。将以下代码写入您的 MainActivity 例如

      if(tab1fragment != null) {
        String text = tab1fragment.getData();
      }
      

      在 Fragment 中,创建一个类似的方法

      public String getData(){
       return edittext.getString().toString();
      }
      

      这样您可以从片段中检索数据。

      【讨论】:

        【解决方案4】:

        Tablayout 仅包含 TabItems 而不是 Fragment。所以,我相信你使用 TabLayout 结合 ViewPager,它实际上包含 2 个不同的 Fragment。我想也许你想从 2 个片段的活动中获取数据()。至此,你就可以很方便的通过 Fragment 回调 Activity 并像 getData() 一样提供数据了。代码看起来像

        在片段中

        public class BaseFragment extends Fragment {
            protected DataCallback mCallback;
        
            @Override public void onAttach(Context context) {
                super.onAttach(context);
                if (context instanceof DataCallback) {
                    mCallback = (DataCallback) context;
                }
            }
        
            //some place fragment affect to data
            private void someFunction() {
                mCallback.updateDataToActivity(data);
            }
        }
        

        活动中

        public class MyActivity extends BaseActivity implements DataCallback {
        
            T data;
            public void updateDataToActivity(T data) {
                this.data = data
            }
        
            // This is your getData function
            private T getData() {
                return data;
            } 
        }
        

        还有数据回调

        public interface DataCallback {
            void updateDataToActivity(T data);
        }
        

        【讨论】:

          【解决方案5】:

          你可以这样使用:

          Bundle bundle = new Bundle();
          bundle = getActivity().getIntent().getExtras();
          YourFragment fragment = new YourFragment();
          bundle.putString("yourKey", yourValue);
          fragment.setArguments(bundle);
          

          然后你可以在你的第二个片段中得到它们

          onCreateView

          if (getArguments() != null) 
          {
            mParam1 = getArguments().getString("yourKey");  
          }
          

          【讨论】:

          • 在您的第一个片段中,将此代码替换为您的第二个片段的名称。你能提供你的片段代码吗?
          • 它用于将值传递给片段,请格式化您的代码以获得更好的质量,这将对您有所帮助
          【解决方案6】:

          您可以使用 Otto 之类的数据总线库:http://square.github.io/otto/

          或 Rxjava :https://github.com/ReactiveX/RxJava

          这两个库都是为在类之间传播数据而设计的。

          【讨论】:

          • 我不需要任何库
          【解决方案7】:

          每个选项卡都有一个带有 id 的 EditText

          在 tab1.xml 中是 edit1

          <EditText
                  android:id="@+id/edit1"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"/>
          

          它是tab2.xml中的edit2

          <EditText
              android:id="@+id/edit2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
          

          tab1.xml 和tab2.xml 也有一个可以点击的按钮。如果你想在 tab1 和 tab2 上它有相同的 id。

            <Button
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/knop"
                  android:onClick="klik"/>
          

          重要的项目是 OnClick。它指向必须在 MainActivity.java 代码中实现的一段代码

          public void klik(View v){
              alert("Just an alert.");
              String val1 = ((EditText) findViewById(R.id.edit1)).getText().toString(); 
              String val2 = ((EditText) findViewById(R.id.edit2)).getText().toString(); 
              alert(val1);
              alert(val2);
              alert(val1 + val2);
          }
          

          最后是警报程序

          private void alert(String message){ //mies
              AlertDialog alertDialog = new AlertDialog.Builder(this).create();
              alertDialog.setTitle("Alert");
              alertDialog.setMessage(message);
              alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                      new DialogInterface.OnClickListener() {
                          public void onClick(DialogInterface dialog, int which) {
                              dialog.dismiss();
                          }
                      });
              alertDialog.show();
           }
          

          实际上片段可以被视为一页。您可以通过调用主页面的 id 从每个字段中检索信息,在本例中为 MainActivity.java。

          【讨论】:

            猜你喜欢
            • 2016-07-28
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 2014-11-24
            • 1970-01-01
            • 1970-01-01
            • 2021-01-13
            • 1970-01-01
            相关资源
            最近更新 更多