Android 单击按钮时刷新片段视图
我有一个片段活动,它使用ViewPager显示一组片段。在片段活动中,我有一个按钮,单击该按钮时,它会向当前片段发送一条消息以刷新其内容。一切正常(活动/当前片段通信),但我无法刷新片段的视图。通过getView()访问当前视图不起作用,因为此函数返回null;似乎在创建片段之后(在调用ViewCreated时),getView会被销毁。我是不是遗漏了什么?如何使片段以编程方式重新绘制其内容?似乎唯一可行的方法是从父活动创建片段。我是否必须删除并重新添加片段才能执行此操作 代码如下: 主要活动:Android 单击按钮时刷新片段视图,android,view,android-fragments,Android,View,Android Fragments,我有一个片段活动,它使用ViewPager显示一组片段。在片段活动中,我有一个按钮,单击该按钮时,它会向当前片段发送一条消息以刷新其内容。一切正常(活动/当前片段通信),但我无法刷新片段的视图。通过getView()访问当前视图不起作用,因为此函数返回null;似乎在创建片段之后(在调用ViewCreated时),getView会被销毁。我是不是遗漏了什么?如何使片段以编程方式重新绘制其内容?似乎唯一可行的方法是从父活动创建片段。我是否必须删除并重新添加片段才能执行此操作 代码如下: 主要活动:
public class MainActivity extends FragmentActivity {
private MyAdapter mAdapter;
private static ViewPager mPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViewPager();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_test:
updateFragment();
return true;
default: return true;
}
}
private void updateFragment() {
for (int i=0; i< mAdapter.getCount(); i++) {
SampleFragment fragment = (SampleFragment) mAdapter.getItem(i);
fragment.update();
}
}
private void setupViewPager() {
try {
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(this.mAdapter);
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
SampleFragment fragment = new SampleFragment(position);
return fragment;
}
@Override
public int getCount() {
return 5;
}
}
}
当从主活动中的菜单项调用view.FindViewById(view为null)时,错误发生在view.FindViewById上。您可以查看其中的说明,了解如何在ViewPager中保留对片段的引用
本页介绍了两种方法。第一个涉及在使用FragmentManager添加片段时设置标记。然后,您可以使用findFragmentByTag()
检索片段。但是,我没有看到如何使用FragmentPagerAdapter或FragmentStatePagerAdapter来实现这一点,因为这些实现为您添加了片段。如果您正在使用自己的自定义PagerAdapter,这可能适合您
另一种方法适用于FragmentPagerAdapter或FragmentStatePagerAdapter,包括保留所有片段的映射,在getItem()
和destroyItem()实现中进行更新。这种方法对我有效
一旦对当前片段进行了引用,就可以在片段中调用一个方法来刷新其视图。您可以从布局中捕获/存储要在片段中修改的视图吗?例如,TextView mTitle=(TextView)findById(R.id.title);然后再编辑视图的文本?我已经试过了,但是当我需要更新布局时,它们也变成了空的。你能发布一些代码来帮助解释发生了什么吗?我已经发布了片段活动和片段的代码。问题是在片段内调用getView()造成的,该片段由activity.UgglyNoodle中的fragment.update()调用。更新片段的地方似乎有很多问题。在Android中,Adapter
s负责更新它们发出的View
s的内容(它们通过填充数据将数据“适配”到视图中)。对于Fragment
s也是如此。第二种方法肯定更好。谢谢
public class SampleFragment extends Fragment{
private int myPosition = -1;
public SampleFragment(int position) {
this.myPosition = position;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
update(view, "Updated from onCreateView");
return view;
}
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.textTitle).setOnClickListener(myClickListener);
}
private OnClickListener myClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.textTitle:
break;
}
}
};
public void update() {
update(getView(), "Updated from main");
}
private void update(View view, String subtitleText) {
TextView title = (TextView) view.findViewById(R.id.textTitle);
TextView subtitle = (TextView) view.findViewById(R.id.textSubtitle);
title.setText("Fragment " + myPosition);
subtitle.setText(subtitleText);
}
}