【问题标题】:How to use Dialog inside BaseAdapter?如何在 BaseAdapter 中使用 Dialog?
【发布时间】:2012-07-03 21:29:32
【问题描述】:

我正在开发一个带有水平列表视图的产品应用目录,当您单击该产品时,我无法打开自定义对话框。

我的部分代码:

主要活动

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");

显示对话框的功能

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 活动

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;
    }

}

错误

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)

打印

产品列表视图 - http://cl.ly/2l0W0u421U1s0t3p2v15

已打开产品 - http://cl.ly/0R2s0g2a1C0J171b0n3z

我可以解决我的问题!!!是的!!! \o/ #

主要活动我改变:

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

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

然后在 BaseAdapter Activity 上进行更改:

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

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

然后添加

    private Produtos mContext;  

改变

    firstClass.showProdutoDialog();  

    mContext.showProdutoDialog();

【问题讨论】:

    标签: android listview dialog baseadapter


    【解决方案1】:

    什么是头等舱?它是一个活动吗?尝试像这样创建对话框:

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

    如果使用 getApplicationContext() 无法获取上下文,请将 ProdutoAdapter 接收到的上下文保存在构造函数中。而不是将此上下文传递给:

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

    当你调用 showProdutoDialog 时,这样做:

    firstClass.showProdutoDialog(mContext);
    

    比,做:

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

    【讨论】:

    • 谢谢你。是的,firstClass 是 Produtos Acativity 的参考。我进行了更改,现在出现此错误: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application Online: dialog.show();我搜索了这个错误,但我无法修复。
    • 我从另一个线程复制了这个:您不能通过不是 Activity 的上下文显示应用程序窗口/对话框。请检查您每次启动对话框时是否获得正确的上下文。
    • 非常感谢乌列尔。你有什么建议来解决这个问题吗?我是初学者,我想不出别的办法。
    • 忽略我的评论,我可以解决我的解决方案并在我的问题末尾添加。即便如此,还是谢谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多