2012-07-03 8 views
5

Pracuję nad katalogiem aplikacji z poziomym widokiem listy i nie mogę otworzyć Niestandardowego okna dialogowego po kliknięciu produktu.Jak korzystać z okna dialogowego w BaseAdapter?

Niektóre części mojego kodu:

podstawowej działalności

public class Produtos extends Activity { 
    public static String ListadeProdutos; 
    private ProdutosAdapter dbHelper; 
    private ProgressDialog progressDialog; 
    private TiposAdapter tipDB; 
    private CategoriasAdapter catDB; 
    private AutoCompleteTextView AutBusca; 
    public static String cateId, tipoId, filtroAz, busca; 
    Cursor AllProdutos; 

    //LazyAdapter adapter; 

    public static String theProdNome, theProdDesc, theProdFoto; 
    public static int ProdutoAtual; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     overridePendingTransition(R.anim.fadein, R.anim.fadeout); 
     setContentView(R.layout.produtos); 

     cateId = getIntent().getStringExtra("cat"); 
     tipoId = getIntent().getStringExtra("tipo"); 
     filtroAz = getIntent().getStringExtra("filtroAz"); 
     busca = getIntent().getStringExtra("busca"); 

     theProdNome = getIntent().getStringExtra("prodNome"); 
     theProdDesc = getIntent().getStringExtra("prodDesc"); 
     theProdFoto = getIntent().getStringExtra("prodFoto"); 

Funkcja pokazać Dialog

public void showProdutoDialog(){ 
    final Dialog dialog = new Dialog(this,R.style.CustomDialogTheme); 

    dialog.setContentView(R.layout.produto);//carregando o layout do dialog do xml 

    if (theProdNome != ""){ 
    //carrega os dados 
    TextView titulo = (TextView) dialog.findViewById(R.id.NomeProduto); 
    WebView desc = (WebView) dialog.findViewById(R.id.DescricaoProduto); 
    ImageView img = (ImageView) dialog.findViewById(R.id.FotoProduto); 

    titulo.setText(theProdNome); 

    String html; 
    html = "<strong>Características do Produto</strong><br>"+ theProdDesc; 

    String mime = "text/html"; 
    String encoding = "utf-8"; 

    desc.getSettings().setJavaScriptEnabled(false); 
    desc.loadDataWithBaseURL(null, html, mime, encoding, null); 
    desc.setBackgroundColor(Color.TRANSPARENT); 
    desc.scrollTo(0, 0); 

     final Button fechar = (Button) dialog.findViewById(R.id.bt_fechar); 
    fechar.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      //ação do botão cancelar 
      dialog.dismiss();//encerra o dialog 
     } 
    }); 

     dialog.show();//mostra o dialog 

    }else{ 
     Toast.makeText(this, "Nenhum impresso encontrado", Toast.LENGTH_SHORT).show(); 
    } 

    } 

BaseAdapter aktywny

public class ProdutoAdapter extends BaseAdapter { 
    ImageDownloader downloader; 
    private List<Produto> MyProdutos; 
    private LayoutInflater mInflater; 
    private ViewHolder holder; 

    static class ViewHolder{ 
     private TextView titulo; 
     private ImageView img; 
    } 


    public ProdutoAdapter(Context context, List<Produto> MyProdutos) { 
     mInflater = LayoutInflater.from(context); 
     this.MyProdutos = MyProdutos; 
     downloader = new ImageDownloader(); 
    } 


    @Override 
    public int getCount() { 
     return MyProdutos.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int posicao, View convertView, ViewGroup arg2) { 
     final Produto p = MyProdutos.get(posicao); 

      convertView = mInflater.inflate(R.layout.row_produtos, null); 
      holder = new ViewHolder(); 

      holder.titulo = (TextView) convertView.findViewById(R.id.NomeProduto); 
      holder.img = (ImageView) convertView.findViewById(R.id.FotoProduto); 
      holder.img.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        Produtos firstClass = new Produtos(); 

        firstClass.theProdNome = p.getNome(); 
        firstClass.theProdDesc = p.getProdDesc(); 
        firstClass.theProdFoto = p.getimgNome(); 


        firstClass.showProdutoDialog(); 
       } 

      }); 

     convertView.setTag(holder); 

     holder.titulo.setText(p.getNome()); 
     downloader.download(p.getimgNome(), holder.img); 


     return convertView; 
    } 

} 

Błąd

07-03 09:30:07.639: W/dalvikvm(455): threadid=1: thread exiting with uncaught exception (group=0x40014760) 
07-03 09:30:07.659: E/AndroidRuntime(455): FATAL EXCEPTION: main 
07-03 09:30:07.659: E/AndroidRuntime(455): java.lang.IllegalStateException: System services not available to Activities before onCreate() 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.app.Activity.getSystemService(Activity.java:3922) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.app.Dialog.<init>(Dialog.java:150) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.app.Dialog.<init>(Dialog.java:138) 
07-03 09:30:07.659: E/AndroidRuntime(455): at com.primeiroestilo.Produtos.showProdutoDialog(Produtos.java:570) 
07-03 09:30:07.659: E/AndroidRuntime(455): at com.primeiroestilo.ProdutoAdapter$1.onClick(ProdutoAdapter.java:83) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.view.View.performClick(View.java:3110) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.view.View$PerformClick.run(View.java:11934) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.os.Handler.handleCallback(Handler.java:587) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.os.Looper.loop(Looper.java:132) 
07-03 09:30:07.659: E/AndroidRuntime(455): at android.app.ActivityThread.main(ActivityThread.java:4123) 
07-03 09:30:07.659: E/AndroidRuntime(455): at java.lang.reflect.Method.invokeNative(Native Method) 
07-03 09:30:07.659: E/AndroidRuntime(455): at java.lang.reflect.Method.invoke(Method.java:491) 
07-03 09:30:07.659: E/AndroidRuntime(455): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-03 09:30:07.659: E/AndroidRuntime(455): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-03 09:30:07.659: E/AndroidRuntime(455): at dalvik.system.NativeStart.main(Native Method) 

drukuje

ListView produktów - http://cl.ly/2l0W0u421U1s0t3p2v15

produkt otwarty - http://cl.ly/0R2s0g2a1C0J171b0n3z

mogę rozwiązać mój pr oblem !!! Tak!!! \ O/#

Na podstawowej działalności mogę zmienić:

ProdutoAdapter adapter = new ProdutoAdapter(getApplicationContext(), produtos); 

Aby

ProdutoAdapter adapter = new ProdutoAdapter(Produtos.this, produtos); 

I na BaseAdapter Aktywny zmienić:

public ProdutoAdapter(Context context, List<Produto> MyProdutos) { 
     mInflater = LayoutInflater.from(context); 
     this.MyProdutos = MyProdutos; 
     downloader = new ImageDownloader(); 
    } 

DO

public ProdutoAdapter(Produtos context, List<Produto> MyProdutos) { 
     mInflater = LayoutInflater.from(context); 
     this.MyProdutos = MyProdutos; 
     downloader = new ImageDownloader(); 
     mContext = context; 
    } 

I dodać:

private Produtos mContext; 

I zmianę:

firstClass.showProdutoDialog(); 

ZE

mContext.showProdutoDialog(); 

Odpowiedz

1

Co jest firstClass? Czy to działanie? starają się stworzyć Dialog tak:

Context mContext = getApplicationContext(); 
Dialog dialog = new Dialog(mContext); 

Jeśli nie można uzyskać za pomocą getApplicationContext kontekst(), zapisz kontekście, że ProdutoAdapter przyjmuje w konstruktorze.niż zdać ten kontekst:

Context mContext; 
public ProdutoAdapter(Context context, List<Produto> MyProdutos) { 
    mInflater = LayoutInflater.from(context); 
    this.MyProdutos = MyProdutos; 
    downloader = new ImageDownloader(); 
    mContext = context; 
} 

kiedy zadzwonić showProdutoDialog zrobić to tak:

firstClass.showProdutoDialog(mContext); 

niż zrobić:

public void showProdutoDialog(Context context){ 
     final Dialog dialog = new Dialog(context,R.style.CustomDialogTheme); 
     //continue from here 
+0

Thanks faceta. I tak, firstClass jest odniesieniem do Produtos Acativity. dokonać zmiany i teraz mam ten błąd: android.view.WindowManager $ BadTokenException: Nie można dodać okno - token nie jest zerowy dla aplikacji On line: dialog.show(); Przeszukuję ten błąd, ale nie mogę go naprawić. –

+0

Skopiowałem to z innego wątku: Nie można wyświetlić okna/okna aplikacji za pośrednictwem kontekstu, który nie jest działaniem. Sprawdź, czy za każdym razem, gdy otwierasz okno dialogowe, otrzymujesz poprawny kontekst. –

+0

Wielkie dzięki Uriel. Masz jakieś sugestie, aby rozwiązać ten problem? Jestem początkującym i nie mogę myśleć inaczej. –