selam arkadaşlar,

kaldığı yeri kaydetmek için

public class Tebyn extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener { ...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.tebyn_main, container, false);
    if (container == null) {
        return null;
    }

   prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
   editor = prefs.edit();
   bar = (ScrollView) rootView.findViewById(R.id.scrolbar);

  bar.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {

            editor.putInt("Scroll", bar.getScrollY());
            editor.commit();;

        }
    });

 rootView.post(new Runnable() {
    @Override
    public void run() {
        bar.scrollTo(0, prefs.getInt("Scroll",0));
    }
});

   return rootView;

     }

} çeşitli tiplerde set etmeyi denedim ama açılışta bar ölçüsü olan değerler 0 - 0 oluyor tekrar açtığında kayıtlı yerden devam etmesi icin nasil yapmam lazım

soruldu: 22 Şub, 16:19

kypdk's gravatar image

kypdk
18591623
cevap kabul oranı: 10%

değiştirildi: 04 Mar, 03:11


Tekrardan Merhabalar.. Yoğunluktan dolayı projeye anca bakabildim. Projenin tamamına baktığımızda bazı AsyncTask() işlemleri bulunmakta. Yukarıda yazdığımız scrollTo() işlemi bu AsyncTask() işlemlerinden bağımsız olduğu için scrollTo() metodu çalıştığında AsyncTask() işlemi tamamlanmamış olduğundan ScrollView'imiz boş olacaktır. Dolayısıyla da scrollTo() ile scrollbar ın pozisyonunu değiştirmemiz mümkün olmayacaktır.

Ikinci bir durum ise; AsyncTask() işlemi sona erdiğinde ScrollView'in içi TextView ile dolacağından yeni bir scrollbar oluşacak ve dolayısıyla onScrollChanged() metodu tetiklenecektir. Metod tetiklendiği anda scrollbar'ın konumu 0 olduğu için SharedPreferences değerimiz de 0 olarak güncellenecektir. Bu yüzden de her açıldığında değer 0 olarak değişmektedir.

Gelelim çözüme...

Adım 1 : Uygulama ilk Açıldığında (MainActivity açıldığında) prefs.getInt("bar_yeri") değerini bir int değişkenine kaydettim.

public class Tebyn extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener {

private static final String TAG = "Renk";
String renk_pozisyon;
View rootView;
TextView tebyn;
SharedPreferences prefs;
SharedPreferences.Editor editor;
ScrollView scrollView;
int scroll;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.tebyn_main, container, false);
    if (container == null) {
        return null;
    }
    tebyn = (TextView) rootView.findViewById(R.id.tebynView);
    Spinner s_tebyn = (Spinner) rootView.findViewById(R.id.s_tebyn);

    scrollView = (ScrollView) rootView.findViewById(R.id.scrollView);
    prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
    editor = prefs.edit();
    scroll = prefs.getInt("bar_yeri", 0);

2 - onScrollChanged() metodu ile scrollbar'ın pozisyonunu SharedPreferences ile kaydettim.

        scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            editor.putInt("bar_yeri", scrollView.getScrollY());
            editor.commit();
        }
    });

3 - AsyncTask() sınıfının yapıcı metodunu Tebyn.java sınıfındaki scrollView nesnesini ve scroll değişkenini kullanabilmek için düzenledim.

public class HTMLAsynTask extends AsyncTask<String, String, String> {

private Context context;
private ProgressDialog progressDialog;
SharedPreferences prefs;
String renk_pozisyon;
TextView tv_tebyn;
String meal_list;
// yeni eklediğim nesneler
private ScrollView scrollView;
private int scroll;

public HTMLAsynTask(Context context, ScrollView scrollView, int scroll) {
    this.context = context;
    // yeni nesnelerin değerlerini belirlediğim kısım
    this.scrollView = scrollView;
    this.scroll = scroll;

    tv_tebyn = (TextView) ((AppCompatActivity) context).findViewById(R.id.tebynView);
    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    renk_pozisyon = prefs.getString("arkaplan", "0");
}

4 - onPostExecute() metodu ile AsyncTask işlemleri sona erdiğinde scrollbar'ın belirlediğimiz scroll değişkenine gelmesini sağladım.

    @Override
protected void onPostExecute(String result) {

    tv_tebyn.setText((Html.fromHtml(String.valueOf(result))));
    progressDialog.cancel();

    // scrollbar'ın değiştirildiği kısım
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.scrollTo(0, scroll);
        }
    });

}

5 - son olarak ta web servis ile veri alırken AsyncTask() sınıfını değiştirdiğimiz için buna bağlı olarakta servis isteği yaparken ekstra parametreler girmemiz gerekti. (parametreler : ScrollView ve scroll değişkeni)

                    case 0:
                    new HTMLAsynTask(getActivity(), scrollView, scroll).execute("alak");
                    break;

Sonuç başarılı..

En başta sonunun kaynağını anlatırken teknik anlamda hatalı olduğunu düşündüğünüz bir yer varsa belirtirseniz sevinirim. Bildiğim kadarıyla açıklamaya çalıştım. Herkese iyi kodlamalar.. :)

permanent link

cevaplandı: 04 Mar, 10:36

umonn's gravatar image

umonn
80013
cevap kabul oranı: 25%

değiştirildi: 04 Mar, 10:44

öyle büyük zahmet verdin ki ne kadar teşekkür etsem az

(04 Mar, 11:19) kypdk kypdk's gravatar image
1

"öyle büyük zahmet verdin ki ne kadar teşekkür etsem az" kinaye mi,yazim hatasi mi, turkce bilmeme mi? Bir kac yuz kelimeden fazlasiyla konusamayan turk gencligi :(

(05 Mar, 18:29) eser1 eser1's gravatar image

Merhabalar.

   if (bar_yeri != 0) {
    System.out.println("bar yeri " + bar_yeri);
    //bar.setScrollY(bar_yeri);
    //bar.scrollTo(0, bar_yeri);
    bar.smoothScrollTo(0, bar_yeri);

}*/

kodu yerine

     bar.post(new Runnable() {
        @Override
        public void run() {
            bar.scrollTo(0, prefs.getInt("bar_yeri",0));
        }
    });

kullanırsan işini görecektir.

Burada:

prefs.getInt("bar_yeri",0) metodu, "bar_yeri" anahtarıyla saklamış olduğumuz int değerini bize verir. Eğer anahtar içerisinde herhangi bir değer kaydedilmemişse 0 değerini verir.

permanent link

cevaplandı: 23 Şub, 07:26

umonn's gravatar image

umonn
80013
cevap kabul oranı: 25%

değiştirildi: 23 Şub, 07:27

uzunca bir aradan sonra deneyenildim. malesef olmadi tekrar Y koordinati açarken 0 olarak gösteriyor

(28 Şub, 17:08) kypdk kypdk's gravatar image

yöntemde bi hata olmaması gerek... Github'a örnek kod ekledim. Bi incele istersen.. Eğer yine olmazsa kodlarının tamamını paylaş yardımcı olmaya çalışırım.

Örnek Kodlar :

https://github.com/umon/scrollto-btsoru

(29 Şub, 05:49) umonn umonn's gravatar image

en iyisi kodları vereyim. Extends fragment yapımın içinde birde uzunca bir switch_case mevcut senin kodu en altına koydum sıkıntı şu kaydedilen konum açılışta gösteriyor fakat tekrar sıfır gösteriyor hatayi bulamadım. bu kod üzerinden çözülmezse tüm projeyi açarim kendi özel git sunucumdan eposta adresi vermen yeterli şimdiden çok teşekkür ederim

https://github.com/tutked/calis/blob/master/Tebyn.java

(01 Mar, 18:25) kypdk kypdk's gravatar image

projeyi açarsan daha iyi olacak gibi :)

Mail : umutonur@outlook.com

(02 Mar, 06:25) umonn umonn's gravatar image
1

@kypdk Cok sanslisin ki sureler 117 de bitiyor. 10000 tane filan olsaydi kodun ne olurdu cok merak ediyorum...

(02 Mar, 15:59) eser1 eser1's gravatar image

@umonn Bu tip sitelerin amacinin bilgi paylasmak oldugunu saniyordum. Mail adresine ozel bir sey beklemenin amaci nedir?

(02 Mar, 16:13) eser1 eser1's gravatar image

@eser1 : Mail adresime özel bir şey beklememin amacı şudur:

Arkadaş git sunucusu üzerinde ki projesine erişebilmem kullanıcı adı ve şifre yolladı.

Bende projenin tamamına bakıp sorunu çözmeye çalışacağım. Düzeltmesi gereken yeri de yine bu başlıktan açıklayacağım..

(03 Mar, 03:17) umonn umonn's gravatar image

@umonn Tamam madem arkadas tum site kullanicilari yerine sadece senin yardimina razi, bana da uyar...

(03 Mar, 15:52) eser1 eser1's gravatar image

fragment olduğu için sanirim onCreatView metodu ile view'i super'lemek lazım. araştırmaya devam ediyorum. kodun özet halini değiştirdim

(04 Mar, 03:12) kypdk kypdk's gravatar image

@eser1 kodu bütünlüğünle bakmak için çözüme ulaştigimizda tekrar burda paylaşacam böyle böyle yaptik diye olay bu! ver email adresi senide ekleyyim kayırmaca yok sende bak :)

(04 Mar, 04:13) kypdk kypdk's gravatar image
10 yorumdan 5 tanesi gösteriliyor hepsini göster
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×817

Soruldu: 22 Şub, 16:19

Görüntüleme: 333 kez

Son güncelleme: 05 Mar, 18:43

powered by BitNami OSQA