Android:从活动更新选项卡布局(片段)文本视图 [英] Android : Update Tab Layout(fragments) textviews from an activity

查看:105
本文介绍了Android:从活动更新选项卡布局(片段)文本视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用tablayout和viewpager创建选项卡视图.我为每个选项卡使用一个片段.在我的MainActivity中,我通过蓝牙从设备中获得了一些价值.这些值作为单个字符串接收,我将其拆分并将其设置到相应的选项卡.但是,当我尝试从活动的片段中调用textview的setText方法时,出现了NullPointerException异常. 有人可以告诉我如何从MainActivity更新每个片段的文本视图吗?像,如果我选择温度选项卡,则应使用MainActivity中的值更新温度片段中的textview.请帮助

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

活动

    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

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

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>

推荐答案

我不确定我是否正确理解您的问题,但请允许我尝试帮助.

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

我假设您的ViewPager适配器从FragmentStatePagerAdapter

I assume your ViewPager adapter extends from FragmentStatePagerAdapter

首先在您的Pager适配器中为片段定义SparseArray,如下所示:

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

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

在适配器的instantiateItem方法中,将片段添加到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;
   }

然后在您的destroyItem方法中,从稀疏数组中删除片段.

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

在您的adpater中添加一个方法,该方法将返回如下所示的寻呼机片段:

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

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

在您的片段中定义一个公共方法,该方法将更改您的TextView的文本,例如:

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

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

在活动中定义您的适配器,然后向您的ViewPager中添加一个onPageChangeListener,如下所示:

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.

这篇关于Android:从活动更新选项卡布局(片段)文本视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆