Saya memiliki tata letak yang sangat sederhana tapi ketika saya sebut setRefreshing(true)
di onActivityCreated()
fragmen saya, itu tidak menunjukkan awalnya.
Itu hanya menunjukkan ketika saya melakukan tarik untuk menyegarkan. Adakah ide mengapa ini tidak muncul pada awalnya?
Fragmen xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
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">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</RelativeLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Kode fragmen:
public static class LinkDetailsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
@InjectView(R.id.swipe_container)
SwipeRefreshLayout mSwipeContainer;
public static LinkDetailsFragment newInstance(String subreddit, String linkId) {
Bundle args = new Bundle();
args.putString(EXTRA_SUBREDDIT, subreddit);
args.putString(EXTRA_LINK_ID, linkId);
LinkDetailsFragment fragment = new LinkDetailsFragment();
fragment.setArguments(args);
return fragment;
}
public LinkDetailsFragment() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mSwipeContainer.setOnRefreshListener(this);
mSwipeContainer.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
mSwipeContainer.setRefreshing(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_link_details, container, false);
ButterKnife.inject(this, rootView);
return rootView;
}
@Override
public void onRefresh() {
// refresh
}
}
android
swiperefreshlayout
Ninja guntur
sumber
sumber
Jawaban:
Menghadapi masalah yang sama. Solusi saya -
sumber
Lihat jawaban Volodymyr Baydalka sebagai gantinya.
Ini adalah solusi lama.
Itu digunakan untuk bekerja pada versi sebelumnya
android.support.v4
, tetapi dari versi 21.0.0 yang sedang berjalan itu tidak berfungsi dan masih ada denganandroid.support.v4:21.0.3
dirilis pada 10-12 Desember 2014 dan ini adalah alasannya.Indikator SwipeRefreshLayout tidak muncul ketika
setRefreshing(true)
dipanggil sebelumSwipeRefreshLayout.onMeasure()
Penanganan masalah:
memanggil
setProgressViewOffset()
padaSwipeRefreshLayout
yang tidak valid tampilan lingkaran dari tata letak menyebabkanSwipeRefreshLayout.onMeasure()
dipanggil segera.UPDATE Solusi yang Lebih Baik
Karena bilah tindakan bisa menjadi lebih tipis ketika orientasi berubah atau Anda telah menetapkan ukuran bilah tindakan secara manual. Kami menetapkan offset dalam piksel dari bagian atas tampilan ini tempat pemintal progres harus datang untuk mengatur ulang setelah gerakan gesek yang berhasil ke ukuran bilah tindakan saat ini.
UPDATE 20 Nov 2014
Jika itu tidak terlalu penting untuk aplikasi Anda untuk menunjukkan SwipeRefreshLayout setelah tampilan dimulai. Anda dapat mempostingnya di waktu mendatang dengan menggunakan penangan atau hal lain yang Anda inginkan.
sebagai contoh.
atau seperti jawaban Volodymyr Baydalka.
Inilah masalah dalam pelacak masalah android. Harap perbarui untuk menunjukkan kepada mereka bahwa kami perlu memperbaikinya.
sumber
delay time
? Saya menggunakan500
pada sayaGalaxy S4
. Tidak yakin apakah ini akan menjadi masalah pada perangkat lain.500
akan baik-baik saja. Saya telah mengujinya pada.emulator
Saya hanya inginsafe
bersama1000
milidetikSolusi saya adalah mengganti
SwipeRefreshLayout
:sumber
sumber
setRefreshing(false)
dibungkusonGlobalLayoutListener()
tidak menghilangkan indikator pengisian.Dengan perpustakaan dukungan Android 24.2.0 masalah seharusnya sudah terpecahkan! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
sumber
Berdasarkan jawaban Volodymyr Baydalka , ini hanya ide kecil yang akan membantu Anda menjaga kode tetap bersih. Saya layak menerima posting yang saya yakin: Anda dapat dengan mudah mengembalikan perilaku dari memposting ke panggilan metode langsung, setelah bug diperbaiki.
Tulis kelas utilitas seperti:
Dalam pengganti kode Anda
mSwipeContainer.setRefreshing(isRefreshing)
denganUtils.setRefreshing(mSwipeContainer, isRefreshing)
: sekarang hanya satu titik dalam kode yang perlu diubah setelah bug diperbaiki,Utils
kelas. Metode ini juga dapat diuraikan (dan dihapus dariUtils
).Biasanya tidak ada perbedaan visual yang nyata. Perlu diingat bahwa penyegaran yang tertunda dapat tetap menghidupkan
Activity
instance lama Anda , berpegang padaSwipeRefreshLayout
hierarki tampilan mereka. Jika itu adalah masalah, atur metode untuk menggunakanWeakReference
s, tetapi biasanya Anda tidak memblokir utas UI, dan karenanya menunda gc hanya dengan beberapa milidetik.sumber
Anda juga dapat memanggil metode ini sebelum setRefreshing ..
Ini berhasil bagi saya.
sumber
Saya menggunakan Perpustakaan AppCompat
com.android.support:appcompat-v7:21.0.3
, menggunakan pendekatan yang sama dan berhasil. Jadi, Anda memperbarui versi perpustakaan itu.Saran:
RelativeLayout
tidak mendukung orientasi, itu adalah atribut untukLinearLayout
.Layout XML:
sumber
Selain Volodymyr Baydalka, gunakan kode berikut juga:
Penjelasan Saya menerapkan solusi yang diberikan oleh Volodymyr Baydalka (menggunakan fragmen) tetapi setelah swipeReferesh mulai, itu tidak pernah hilang bahkan pada panggilan
swipeContainer.setRefreshing(false);
jadi harus mengimplementasikan kode yang diberikan di atas yang memecahkan masalah saya. ada lebih banyak ide mengapa hal ini terjadi sangat disambut.Salam,
'com.android.support:appcompat-v7:22.2.1'
sumber
@ niks.stack Menanggapi jawabannya, saya akan menunjukkan roda progres setelah
onLayout()
selesai. Ketika saya menggunakannya langsung setelahonMeasure()
itu, itu tidak akan menghormati sebagian dari offset, tetapi menggunakannya setelahonLayout()
itu.sumber
Solusi saya (tanpa dukungan v7) -
sumber
Saya menggunakan 'com.android.support:appcompat-v7:23.1.1'
sebelumnya saya menggunakan metode
swipeRefreshLayout.setRefreshing(true);
insidegetData()
, jadi tidak berfungsi. Saya tidak tahu mengapa itu tidak bekerja di dalam metode.Meskipun saya
swipeRefreshLayout.setRefreshing(true);
hanya menggunakan sekali dalam Fragmen saya.sumber
Coba ini
mSwipeRefreshLayout.setNestedScrollingEnabled (true);
sumber
Solusi lain adalah membuat kontrol dan deriver baru dari SwipeRefreshLayout. Ganti fungsi OnMeasure dan aktifkan kembali penyegaran, jika penyegaran diaktifkan. Saya menggunakan solusi ini dalam proyek xamarin dan ini bekerja dengan baik. Berikut beberapa contoh C # -Kode:
sumber