如何在标签之间传递数据?

时间:2017-01-20 10:05:05

标签: android

我在该活动 Tab1 Tab2 中有一个活动和两个标签。这是两个片段。在我的Tab1中有一个 EditText 字段和一个 Button 字段,而Tab2只有一个 TextView 字段。我想在EditText字段中获取值单击Tab1中的按钮时,Tab2进入Tab2中的TextView字段,并在将Tab1滑动到Tab2时获取值。我也检查了很多网站,但没有得到任何解决方案。如果有人知道,请帮助我。

MainActivity.java

package reubro.com.fragment;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

TabLayout tabLayout;
ViewPager viewPager;

Tab1 t2;

EditText ed1;
Tab1 t1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    t1 = new Tab1();
    ed1 = (EditText) findViewById(R.id.ed1);


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    tabLayout = (TabLayout) findViewById(R.id.tab);
    viewPager = (ViewPager) findViewById(R.id.pager);

    tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    Pager pager = new Pager(getSupportFragmentManager(),tabLayout.getTabCount());
    viewPager.setAdapter(pager);

    tabLayout.setOnTabSelectedListener(this);
}

public void onTabSelected(TabLayout.Tab tab){

    viewPager.setCurrentItem(tab.getPosition());
  //  ed1.setText(t1.ed.getText());
   // Log.d("cccccc",ed1.getText().toString());
}

public void onTabUnselected(TabLayout.Tab tab) {

}


public void onTabReselected(TabLayout.Tab tab) {

}
}

Tab1.java

 package reubro.com.fragment;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
 * Created by pc84 on 20/1/17.
 */

public class Tab1 extends Fragment {

Button b1;
 EditText ed;
    String val;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, final Bundle bundle){
    View view = inflater.inflate(R.layout.tab1,viewGroup,false);

    b1 = (Button) view.findViewById(R.id.btn1);
    ed = (EditText) view.findViewById(R.id.ed1);

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            val = ed.getText().toString().trim();
            if(!(val.isEmpty())){

                Log.d("inner",val);

                Tab2 tab2 = new Tab2();
                Bundle bundle = new Bundle();
                bundle.putString("val",val);
                tab2.setArguments(bundle);
                Toast.makeText(getActivity(),"This is value: "+val,Toast.LENGTH_LONG).show();


            }
        }
    });

    return view;
}

}

Tab2.java

package reubro.com.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by pc84 on 20/1/17.
 */

public class Tab2 extends Fragment {
TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle){
    View view = inflater.inflate(R.layout.tab2,viewGroup,false);
    tv = (TextView) view.findViewById(R.id.tv1);

    Bundle bundle1 = this.getArguments();
    if (bundle1 != null){

        String val = bundle1.getString("val");
        tv.setText(val);
        Log.d("tttttt",val);

    }

    return view;

}


}

Pager.java

    package reubro.com.fragment;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

/**
 * Created by pc84 on 20/1/17.
 */

public class Pager extends FragmentStatePagerAdapter {
    int tabCount;
    public Pager(FragmentManager fm, int tabCount) {
        super(fm);
        this.tabCount = tabCount;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                Tab1 tab1 = new Tab1();
                return tab1;
            case 1:
                Tab2 tab2 = new Tab2();
                return tab2;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return tabCount;
    }
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

             <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
                 android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

            android:id="@+id/tab"
            />

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

tab1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ed1"
        android:hint="Enter something"
        android:layout_margin="20dp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:id="@+id/btn1"
        android:layout_below="@+id/ed1"
        android:text="Send to Next Fragment"
        android:textAllCaps="false"/>


</RelativeLayout>

tab2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Tab2"
        android:gravity="center"/>

</RelativeLayout>

5 个答案:

答案 0 :(得分:2)

您可以将数据放入Tabton和Tab2中引用的Singleton。

Singleton是一种编程模式,它允许您始终使用相同且唯一的一个类实例。 这是一个例子:

public class ClassicSingleton {
   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

查看here以获得更详细的说明:

答案 1 :(得分:0)

要将数据从一个标签传递到另一个标签,您可以发送广播,或者如果您不想广播,则首先通过回调将其传递给活动,然后从活动传递到tab2。

答案 2 :(得分:0)

您尝试使用BroadcastReceiver。

在Tab1中:您发送带数据的广播

在Tab2中:您从广播获取数据并设置页面索引

答案 3 :(得分:0)

您可以将Live Data对象与View模型一起使用您可以使用新的Android体系结构轻松实现它。

Doc:https://developer.android.com/topic/libraries/architecture/livedata

不再需要EventBus和获取LiveData的接口。

答案 4 :(得分:0)

我遇到过类似的情况,并想出了以下内容:

  1. MainActivityViewModel 保存您可能需要的任何数据,并设置 相应地,当您感兴趣的事件被触发时。
  2. 然后您可以触发导航到目标选项卡 以编程方式(即使您正在使用多堆栈解决方法 在这里使用 https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample), 并让它从 MainActivityViewModel
  3. 读取信息后,立即将其设置为 null,这样它就不会 错误地再次使用。您还应该有一个默认行为,因为 当标签出于其他原因而出现,并且该变量是null

老实说,我不确定这样做是否违反了一些最佳实践或其他什么东西,但事实证明它很有用,并且不会感觉太“hacky”。​​