如何从选项卡中的两个不同片段获取数据到主要活动

时间:2016-09-13 09:02:53

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

大家好我想知道如何从标签布局中的2个不同片段中获取数据。

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

tab1 helloooooo, tab2 hiiiiiii

我在主活动中有一个按钮,用于同时从两个标签中获取数据。

现在我的问题是如何在用户点击

时同时从两个标签中获取数据

获取数据按钮

希望你能解决我的问题。

注意:在投票前请再次阅读。

enter image description here

7 个答案:

答案 0 :(得分:3)

1。)在活动中保留片段的参考。

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

2。)将对象引用放入Adapter的{​​{1}}中的引用变量中。

getItem()

3。)在@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; } 内,您只需从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(); } getData

中的public方法
fragment

答案 1 :(得分:1)

您可以这样使用:

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

答案 2 :(得分:1)

在你的活动中获取两个片段的成员对象..

FirstFragment mFirstFragment;
SecondFragment mSecondFragment;

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

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

    }

当从活动中点击按钮时,调用两个Fragment的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;
    }
}

答案 3 :(得分:1)

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

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

并在Fragment中创建一个类似

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

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

答案 4 :(得分:1)

Tablayout仅包含TabItems而非片段。所以,我相信你使用TabLayout结合ViewPager,它实际上包含2个不同的片段。我想也许你想在2片段的Activity中获取getData()。此时,您可以轻松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;
    } 
}

和DataCallback

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

每个标签都有一个带有 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。