Android : Update Tab Layout(fragments) textviews from an activity

青春壹個敷衍的年華 提交于 2019-12-13 23:17:54

问题


I'm creating tab view using tablayout and viewpager. I use one fragment for each tab. And in my MainActivity, I'm getting some values from a device through bluetooth. The values are received as a single string, and I split it and sets it to corresponding tabs. But I'm getting a NullPointerException when I try to call the setText method for the textview in fragment from my activity. Can anybody show me how to update the textviews of each of the fragments from my MainActivity?? Like, if i select the temperature tab, the textview in the temperature fragment should be updated with the value from MainActivity. Please Help

Activity

    public class MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

   Handler bluetoothIn;
   private static TextView tmpF, humF, CoF;
   String tempGL, HumGL, coGL, devname;
   double dblTemp, dblCo;
   final int handlerState = 0; // used to identify handler message
   private BluetoothAdapter btAdapter = null;
   private TabLayout tabLayout;
   private ViewPager viewPager;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_frag_home);

 tmpF = (TextView)findViewById(R.id.txt_temp_val);
 humF = (TextView)findViewById(R.id.txt_hum_val);
 co = (TextView)findViewById(R.id.txt_co_val);

//Adding toolbar to the activity
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Initializing the tablayout
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
//Initializing viewPager
viewPager = (ViewPager) findViewById(R.id.pager);
//Adding the tabs using addTab() method
tabLayout.addTab(tabLayout.newTab().setText("Temperature"));
tabLayout.addTab(tabLayout.newTab().setText("Humidity"));
tabLayout.addTab(tabLayout.newTab().setText("CO"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

//Creating our pager adapter
Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount());

//Adding adapter to pager
viewPager.setAdapter(adapter);
viewPager.setOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
//Adding onTabSelectedListener to swipe views
tabLayout.setOnTabSelectedListener(this);

bluetoothIn=new Handler() {

    String readMessage;
    String[] values = new String[]{""};

    public void handleMessage(android.os.Message msg) {

        if (msg.what == handlerState) {

            readMessage = (String) msg.obj;
            values = readMessage.split("#");
            for (int j = 0; j < values.length; j++) {

                int rem = j % 3;

                if (rem == 0) {

                    tmpF.setText(values[j] + " C");
                    tempGL = String.valueOf(values[j]);

                    try {
                        dblTemp = Double.parseDouble(tempGL);
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }

                } else if (rem == 1) {

                    CoF.setText(values[j] + " ppm");
                    coGL = values[j];
                    try {
                        dblCo = Double.parseDouble(coGL);
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }

                } else if (rem == 2) {
                    humF.setText(values[j] + " %");
                    HumGL = values[j];
                }
            }
        }
    }
};

btAdapter=BluetoothAdapter.getDefaultAdapter(); // get Bluetooth
}

 @Override
 public void onTabSelected(TabLayout.Tab tab) {
// mViewPager.setCurrentItem(tab.getPosition());

}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

 @Override
 public void onTabReselected(TabLayout.Tab tab) {

 }
 }

Tab1

  public class OneFragment extends Fragment {

  View view;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,    Bundle savedInstanceState) {
 view = inflater.inflate(R.layout.fragment_one, container, false);
 return view;

 }
 }

fragment_one.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="shinil.tablayout.OneFragment"
 android:id="@+id/rltnvnv">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Temperature"
android:textSize="40dp"
android:textStyle="bold"
android:id="@+id/txt_temp_val"
android:layout_centerInParent="true"/>

</RelativeLayout>

Logcat

  Caused by: java.lang.NullPointerException: Attempt to invoke virtual       method 'void       android.support.v4.view.ViewPager.setAdapter(android.support.v4.view.PagerAdapter)' on a null object reference at   shinil.airopure.MainActivity.onCreate(MainActivity.java:194)

frag_home.xml

    <LinearLayout
    android:id="@+id/main_layout"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">


  <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:id="@+id/tabLayout"
  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"/>


 <android.support.v4.view.ViewPager
  android:id="@+id/pager"
  android:layout_width="match_parent"
 android:layout_height="fill_parent"/>

</LinearLayout>

回答1:


Hi i'm not sure if i understand your problem correctly but let me try to help.

I assume your ViewPager adapter extends from FragmentStatePagerAdapter

First in your Pager adapter define a SparseArray for your fragments like below:

SparseArray<Fragment> myPagerFragments= new SparseArray<>();

In your adapter's instantiateItem method add your fragment to your sparsearray.

@Override
public Object instantiateItem(ViewGroup container, int position) {
      Fragment fragment = (Fragment) super.instantiateItem(container, position);
      myPagerFragments.put(position, fragment);
      return fragment;
   }

And in your destroyItem method remove your fragment from your sparsearray.

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
      myPagerFragments.remove(position);
      super.destroyItem(container, position, object);
   }

Add a method to your adpater which returns your pager fragment likew below:

public Fragment getRegisteredFragment(int position) {
      return myPagerFragments.get(position);
   }

In your fragments define a public method which changes your TextView's text likew below:

public void setText(String text){
    myTextView.setText(text);
}

In your activity define your adapter and add an onPageChangeListener to your ViewPager like below:

MyPagerAdapter mAdapter = new MyPagerAdapter(context,items);
myViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int  positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       Fragment myPagerFragment = mAdapter.getRegisteredFragment(position);
       if(fragment != null){
          ((YourFragment)fragment).setText("Hello World!");
       }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

I hope this'll help you. Good luck.



来源:https://stackoverflow.com/questions/36837643/android-update-tab-layoutfragments-textviews-from-an-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!