刷新或强制重新绘制片段
我有一个扩展xml布局的片段。 我的要求是当我的活动恢复时更新我的片段内的所有视图的文本大小。 我试过了
fragment.getView().invalidate();
这似乎没有做的工作。 我也试过了
fragment.getView().requestLayout();
哪个也没用
在另一个活动,我有一个ListFragment需要做同样的事情。 我试过了
listfragment.getListView().invalidate();
哪个技巧 ,刷新我的列表视图,并重新绘制其中的所有项目。
我不明白为什么一个作品,而不是另一个作品。
我也看到有人build议启动一个片段事务,并用新的片段replace当前的片段,这让我不知道
-
为什么我应该创build一个全新的片段,并在我所需要的是刷新片段包含的视图上的文本时replace当前的片段。
-
片段事务方法将阻止我在我的活动的布局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()
。
在我的情况下, detach
和attach
工作给我。
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();