Android:从活动更新选项卡布局(片段)文本视图 [英] Android : Update Tab Layout(fragments) textviews from an activity
问题描述
我正在使用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屋!