5

W porządku, więc mam listę (która jest również oknem dialogowym fragmentu), która wyświetla znajomych użytkowników, a każdy element na tej liście ma przycisk (oznaczony etykietą znajomych na zdjęciu) i gdy użytkownik kliknie ten przycisk, chce wyświetlić okno dialogowe innego fragmentu, które wyświetla wszystkie opcje interakcji z tym użytkownikiem (żądanie znajomego, blok, wysłanie wiadomości prywatnej itd.) problem polega na tym, że ten przycisk i jego detektor onClick jest obecnie implementowany poprzez nadpisanie mojej metody viewview adapterów getView i utworzenie fragmentDialog wymaga dostępu do menedżera fragmentów. czy istnieje sposób, aby to zadziałało?Uruchamiaj fragment okna po kliknięciu przycisku z niestandardowego adaptera podstawowego> getView [IMG INCLUDED]

EDYCJA: Nie mogę zaksięgować rzeczywistego kodu z projektu, ale dołączam uproszczony podstawowy adapter w. onClickListener, które powinno wyjaśnić, co próbuję zrobić. Nie można uzyskać dostępu do fragmentManager z klasy adaptera podstawa, aby fragment dialogowego możliwy

LazyAdapter.java 
package com.example.androidhive; 

import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class LazyAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater=null; 
    public ImageLoader imageLoader; 

    public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data=d; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.list_row, null); 
     Button requestBtn = (Button)vi.findViewById(R.id.title); // title 

     HashMap<String, String> song = new HashMap<String, String>(); 
     song = data.get(position); 

     // Setting all values in listview 
     title.setText(song.get(CustomizedListView.KEY_TITLE)); 
     artist.setText(song.get(CustomizedListView.KEY_ARTIST)); 
     duration.setText(song.get(CustomizedListView.KEY_DURATION)); 
     imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image); 

     requestBtn.setOnClickListener(new myOnClickListener(position)); 
     return vi; 
    } 

     public class myOnClickListener implements OnClickListener{ 
    private int position; 
    private String clicked_uid; 
    public myOnClickListener(int position){ 
     this.position=position; 
    } 
    @Override 
    public void onClick(View v) { 


    //THIS IS WHERE IM TRYING TO PUT THE FRAGMENT DIALOG 

     FragmentManager fm = TabHostFragmentActivity.this.getSupportFragmentManager(); 
     FriendsFamiliarsDialog friendsDialog = new FriendsFamiliarsDialog().newInstance(TabHostFragmentActivity.profile_uid,"friends"); 
     friendsDialog.show(fm, "friendsdialog"); 





    } 

    } 
} 

listview fragment dialog getView android

+1

Czy możesz opublikować odpowiedni kod – TronicZomB

+0

Po przesłaniu kodu klasy adaptera. – GrIsHu

+1

Uruchamianie 'DialogFragment' w' DialogFragment' brzmi nieporządnie. Zamiast używać 'DialogFragment's użyj dialogowych tematów' Activity's. –

Odpowiedz

0

Podczas tworzenia LazyAdapter przejść w widoku, dla którego tworzony jest adapter lub fragmentu macierzystego lub aktywności, a następnie w metodzie onclick użyj tej metody, aby wywołać funkcję na twoim fragmencie lub aktywności, aby pokazać fragment dialogowy, pamiętaj, że z klasy adaptera powinieneś wysyłać wiadomości tylko poprzez wywołania funkcji do składników interfejsu użytkownika, aby robić coś interesującego, jak pokazywanie fragmentów okien dialogowych

+0

w moim rzeczywistym adapterze bazowym przekazuję kontekst, ale z samego kontekstu nie można uzyskać dostępu do menedżera fragmentów z jakiegoś powodu, czy możesz wysłać przykład rozwiązania? Myślę, że znajdziesz ten sam problem co ja – ChuckKelly

+0

Zamiast podawać w kontekście, przekazuj swoją aktywność. powiedzmy, że twoje klasy id TestActivity przekazują to do konstruktora klasy adaptera. a wewnątrz metody onclick wykonaj mTestActivity.ShowDialogFragment (string data1, string data2); –

+0

Wymyśliłem to około 2 min po tym, jak odpowiedziałem, ale zrobiłem to poprzez przekazanie menedżera fragmentów w moim konstruktorze bazowym, który działał .... czy jest jakaś zaleta przekazania fragmentu okna dialogowego w konstruktorze zamiast fragmentu menedżer? – ChuckKelly

12

również walczył o dostęp do Fragm ent Manager z adaptera w celu wyświetlenia DialogFragment. Oto rozwiązanie w postaci kodu:

public class YourPagerAdapter extends PagerAdapter{ 

    private Context context; 

    public YourPagerAdapter(Context c) { 
      this.context = c; 
    } 

    @Override 
     public void onClick(View v) { 
      FragmentActivity activity = (FragmentActivity)(context); 
      FragmentManager fm = activity.getSupportFragmentManager(); 
      YourDialogFragment alertDialog = new YourDialogFragment(); 
      alertDialog.show(fm, "fragment_alert"); 
     } 
} 

Sztuką jest, że pojawi się aktywność jako kontekstu i po prostu rzucić je, aby zapewnić, że jest to FragmentActivity - czyli to, co potrzebuje menedżera. To działa, ponieważ podczas rozmowy YourPagerAdapter w pliku wyższego poziomu można przejść aktywność do niego:

pagerAdapter = new YourPagerAdapter(getActivity()); 
yourViewPager.setAdapter(pagerAdapter); 
+0

Dzięki za odpowiedź, która rozwiązała mój problem – Sam

0

starałem się otworzyć dialogfragment z przycisku znajdującego się w niestandardowych ListView dla aplikacji, która wyświetla listę zdarzeń . Rozwiązałem to przez zmianę mojego konstruktora adaptera.

W mojej klasie adaptera:

public class EventAdapter extends BaseAdapter { 

private Context context; 
private ArrayList <Event> mEvents; 
private FragmentManager fm; 

public EventAdapter(Context context, ArrayList<Event> events, FragmentManager fm) { 
    this.context = context; 
    this.fm = fm; 
    mEvents = events; 
} 

potem udało mi się to zrobić:

 holder.saveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SignupFragment signupFragment = new SignupFragment(); 
      signupFragment.show(fm, "Sample Fragment"); 
      Log.i(TAG, "click on save button"); 
     } 
    }); 

A ja zmieniłem połączenia adaptera w moim wyżej działalności (AllEventsActivity):

FragmentManager fm = getFragmentManager(); 
    mAdapter = new EventAdapter(this, mEvents, fm); 
Powiązane problemy