刷新或强制重新绘制片段

我有一个扩展xml布局的片段。 我的要求是当我的活动恢复时更新我的​​片段内的所有视图的文本大小。 我试过了

fragment.getView().invalidate(); 

这似乎没有做的工作。 我也试过了

  fragment.getView().requestLayout(); 

哪个也没用

在另一个活动,我有一个ListFragment需要做同样的事情。 我试过了

  listfragment.getListView().invalidate(); 

哪个技巧 ,刷新我的列表视图,并重新绘制其中的所有项目。

我不明白为什么一个作品,而不是另一个作品。

我也看到有人build议启动一个片段事务,并用新的片段replace当前的片段,这让我不知道

  1. 为什么我应该创build一个全新的片段,并在我所需要的是刷新片段包含的视图上的文本时replace当前的片段。

  2. 片段事务方法将阻止我在我的活动的布局xml中定义我的片段,我将不得不以编程方式将片段插入到正确的位置。

有没有简单的方法呢?

我不认为有这样的方法。 片段在onCreateView()重build它的UI …但是当片段被创build或重新创build时发生。

你将不得不实现你自己的updateUI方法,或者你将指定什么元素以及它们应该如何更新。 这是一个很好的做法,因为无论如何你都需要这样做。

但是,如果这是不够的,你可以做一些像replace片段与强迫它调用onCreateView()

 FragmentTransaction tr = getFragmentManager().beginTransaction(); tr.replace(R.id.your_fragment_container, yourFragmentInstance); tr.commit() 

注意

要刷新ListView,您需要调用ListView的适配器上的notifyDataSetChanged()

在我的情况下, detachattach工作给我。

  getSupportFragmentManager() .beginTransaction() .detach(contentFragment) .attach(contentFragment) .commit(); 

detach().detach()在支持库更新25.1.0(可能更早)之后不起作用。 此解决scheme更新后正常工作:

 getSupportFragmentManager() .beginTransaction() .detach(oldFragment) .commitNowAllowingStateLoss(); getSupportFragmentManager() .beginTransaction() .attach(oldFragment) .commitAllowingStateLoss(); 

为了解决这个问题,我使用这个:

 Fragment frg = null; frg = getFragmentManager().findFragmentByTag("Feedback"); final android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.detach(frg); ft.attach(frg); ft.commit(); 

这从片段内为我工作:

 Fragment frg = null; Class fragmentClass; fragmentClass = MainFragment.class; try { frg = (android.support.v4.app.Fragment) fragmentClass.newInstance(); }catch(Exception ex){ ex.printStackTrace(); } getFragmentManager().beginTransaction().replace(R.id.flContent, frg).commit(); 

让我们看看下面的源代码。 这里的片段名称是DirectoryOfEbooks。 完成后台任务后,我将用当前片段replace帧。 所以片段被刷新并重新加载其数据

  import android.app.ProgressDialog; import android.content.DialogInterface; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.github.mikephil.charting.data.LineRadarDataSet; import java.util.ArrayList; import java.util.List; /** * A simple {@link Fragment} subclass. */ public class DirectoryOfEbooks extends Fragment { RecyclerView recyclerView; branchesAdapter adapter; LinearLayoutManager linearLayoutManager; Cursor c; FragmentTransaction fragmentTransaction; SQLiteDatabase db; List<branch_sync> directoryarraylist; public DirectoryOfEbooks() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_directory_of_ebooks, container, false); directoryarraylist = new ArrayList<>(); db = getActivity().openOrCreateDatabase("notify", android.content.Context.MODE_PRIVATE, null); c = db.rawQuery("select * FROM branch; ", null); if (c.getCount() != 0) { c.moveToFirst(); while (true) { //String ISBN = c.getString(c.getColumnIndex("ISBN")); String branch = c.getString(c.getColumnIndex("branch")); branch_sync branchSync = new branch_sync(branch); directoryarraylist.add(branchSync); if (c.isLast()) break; else c.moveToNext(); } recyclerView = (RecyclerView) view.findViewById(R.id.directoryOfEbooks); adapter = new branchesAdapter(directoryarraylist, this.getContext()); adapter.setHasStableIds(true); recyclerView.setItemAnimator(new DefaultItemAnimator()); System.out.println("ebooks"); recyclerView.setHasFixedSize(true); linearLayoutManager = new LinearLayoutManager(this.getContext()); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setAdapter(adapter); System.out.println(adapter.getItemCount()+"adpater count"); } // Inflate the layout for this fragment return view; } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.fragment_books); setHasOptionsMenu(true); } public void onPrepareOptionsMenu(Menu menu) { MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.refresh, menu); MenuItem menuItem = menu.findItem(R.id.refresh1); menuItem.setVisible(true); } public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.refresh1) { new AlertDialog.Builder(getContext()).setMessage("Refresh takes more than a Minute").setPositiveButton("Refresh Now", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { new refreshebooks().execute(); } }).setNegativeButton("Refresh Later", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).setCancelable(false).show(); } return super.onOptionsItemSelected(item); } public class refreshebooks extends AsyncTask<String,String,String>{ ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog=new ProgressDialog(getContext()); progressDialog.setMessage("\tRefreshing Ebooks ....."); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected String doInBackground(String... params) { Ebooksync syncEbooks=new Ebooksync(); String status=syncEbooks.syncdata(getContext()); return status; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if(s.equals("error")){ progressDialog.dismiss(); Toast.makeText(getContext(),"Refresh Failed",Toast.LENGTH_SHORT).show(); } else{ fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.mainframe, new DirectoryOfEbooks()); fragmentTransaction.commit(); progressDialog.dismiss(); adapter.notifyDataSetChanged(); Toast.makeText(getContext(),"Refresh Successfull",Toast.LENGTH_SHORT).show(); } } } } 

使用下面的代码再次刷新片段:

 FragmentTransaction ftr = getFragmentManager().beginTransaction(); ftr.detach(EnterYourFragmentName.this).attach(EnterYourFragmentName.this).commit(); 

我正在使用删除和replace两个刷新片段的内容

 final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.remove(resetFragment).commit(); fragmentTransaction.replace(R.id.frame_container,resetFragment).commit();