2016-07-13 41 views
1

我的应用程序中有一个片段,它执行大量后台工作,因此需要很长时间才能加载。我想从我的主要活动中显示ProgressBar,并在片段加载后隐藏它。更改片段时显示ProgressBar - Android

问题是,由于整个UI冻结,进度条不显示,或者卡住了。

如何在片段加载时显示ProgressBar?
谢谢。

编辑:代码里面片断:

public override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     // Create your fragment here 

     fragments = new Fragment[] 
     { 
      new HalachotFragment(), 
      new BooksFragment(), 
     }; 

     var titles = CharSequence.ArrayFromStringArray(new[] 
     { 
       "הלכות", 
       "ספרים", 
     }); 

     tabsAdapter = new TabsFragmentPagerAdapter(ChildFragmentManager, fragments, titles); 

    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 

     var view = inflater.Inflate(Resource.Layout.HalachaSection, container, false); 

     //var progressBar = Activity.FindViewById<ProgressBar>(Resource.Id.progressBar); 

     halachotPager = view.FindViewById<ViewPager>(Resource.Id.halachotPager); 

     halachotPager.Adapter = tabsAdapter; 
     halachotPager.OffscreenPageLimit = 2; 
     halachotPager.SetCurrentItem(1, true); 
     // Bind the tabs to the ViewPager 
     tabs = Activity.FindViewById<TabLayout>(Resource.Id.tabs); 

     tabs.SetupWithViewPager(halachotPager); 
     //var toolbar = Activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar); 
     tabs.Visibility = ViewStates.Visible; 

     //progressBar.Visibility = ViewStates.Gone; 
     return view; 

    } 

BookFragment:

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 
     // return inflater.Inflate(Resource.Layout.YourFragment, container, false); 
     View view = inflater.Inflate(Resource.Layout.Books, container, false); 

     mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.booksRecyclerView); 
     mRecyclerView.NestedScrollingEnabled = false; 

     mBooks = new List<Book>(); 
     ImageView cover = new ImageView(Activity); 
     //cover = view.FindViewById<ImageView>(Resource.Id.coverImage); 
     cover.SetImageResource(Resource.Drawable.Torat_Hamachane1); 
     mBooks.Add(new Book() { Title = "תורת המחנה א' - הלכות יום ויום", Cover = cover, imageResourceId = Resource.Drawable.Torat_Hamachane1}); 

     //Create our layout manager 
     mLayoutManager = new GridLayoutManager(Activity, 2); 
     mLayoutManager.AutoMeasureEnabled = true; 
     //mRecyclerView.SetForegroundGravity(GravityFlags.CenterHorizontal); 
     mRecyclerView.SetLayoutManager(mLayoutManager); 
     SimpleItemAnimator x = null; 

     mRecyclerView.SetItemAnimator(x); 
     mAdapter = new RecyclerAdapter(mBooks, mRecyclerView, Activity); 
     mRecyclerView.SetAdapter(mAdapter); 
     cover = new ImageView(Activity); 
     cover.SetImageResource(Resource.Drawable.kitzurTHM); 
     mBooks.Add(new Book() { Title = "קיצור תורת המחנה - הלכות יום ויום ושבת", Cover = cover, imageResourceId = Resource.Drawable.kitzurTHM, Content = "KitzurTHM/KitzurTHMFull.html" }); 

     cover = new ImageView(Activity); 
     ImageView newCover = new ImageView(Activity); 
     newCover.SetImageResource(Resource.Drawable.halkasPurim); 
     mBooks.Add(new Book() { Title = "הלכה כסדרה - הלכות פורים", Cover = newCover, imageResourceId = Resource.Drawable.halkasPurim }); 

     cover = new ImageView(Activity); 
     cover.SetImageResource(Resource.Drawable.halkasPesach); 
     mBooks.Add(new Book() { Title = "הלכה כסדרה - הלכות פסח", Cover = cover, imageResourceId= Resource.Drawable.halkasPesach }); 

     cover = new ImageView(Activity); 
     cover.SetImageResource(Resource.Drawable.netzach); 
     mBooks.Add(new Book() { Title = "שו\"ת נצח יהודה", Cover = cover , imageResourceId = Resource.Drawable.netzach}); 

     cover = new ImageView(Activity); 
     cover.SetImageResource(Resource.Drawable.tankim); 
     mBooks.Add(new Book() { Title = "טיפול בטנקים בשבת", Cover = cover , imageResourceId = Resource.Drawable.tankim}); 

     cover = new ImageView(Activity); 
     cover.SetImageResource(Resource.Drawable.tipulBeChalalim); 
     mBooks.Add(new Book() { Title = "טיפול בחללים בשבת", Cover = cover , imageResourceId = Resource.Drawable.tipulBeChalalim, Content = "TipulBechalalimShabbat.html" }); 

     Refresh(); 
     return view; 

    } 

HalachotFragment解析文件,这也使得它需要很长的时间。

+0

在此处张贴您的代码 –

+0

您是否在使用asynctask进行后台工作? – comeback4you

+0

由于整个UI冻结。意味着没有在工作中工作线程?显示部分代码 –

回答

0

您可以在您的主要活动中使用ProgressBar,并且每当您更改片段时显示进度栏以及加载片段时隐藏该进度栏,即可立即使进度条对象变为静态。

+0

对不起,但我不太明白你的意思。 – amitairos

0

尝试runOnUiThread如下面的代码片段时是更改,

runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     ProgressDialog pd = new ProgressDialog(Activity.this); 
     pd.setMessage("Testing..."); 
     pd.show(); 

    } 
}); 

如果你想隐藏ProgressDialog手段使用,

pd.hide(); 

希望这可以帮助你。

+0

谢谢。你能看看我的代码,并告诉我如何使用异步,使其不冻结的用户界面?另外,我应该在哪里放这个代码?片段交易后? – amitairos

0

首先你需要发布一些代码部分。

如何在片段加载时显示ProgressBar?

当你从活动调用片段然后onAttach()方法的片段将被调用。所以那个时候你需要在那个方法中使用你的活动对象引用。像,

MainActivity mainActivity; // this should be global 
@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
    mainActivity = (MainActivity)activity; 
} 

因此,使用活动对象,你可以访问你的进度条对象,并把它藏在setUserVisibleHint()方法,其中片段将被完全加载。

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    // TODO Auto-generated method stub 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser) { 
     // hide progress bar 
    } 
} 
+0

谢谢。你能看看我的代码,并告诉我如何使用异步,使其不冻结的用户界面? – amitairos