5
我正在開發具有水平列表視圖的產品的應用程序目錄,並且當您單擊產品時無法打開自定義對話框。如何在BaseAdapter中使用Dialog?
我的代碼的某些部分:
基本活動
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
我可以解決我的公關oblem!是啊! \ O /#
在基本活動我改變:
ProdutoAdapter adapter = new ProdutoAdapter(getApplicationContext(), produtos);
要
ProdutoAdapter adapter = new ProdutoAdapter(Produtos.this, produtos);
而且在BaseAdapter活動我改變:
public ProdutoAdapter(Context context, List<Produto> MyProdutos) {
mInflater = LayoutInflater.from(context);
this.MyProdutos = MyProdutos;
downloader = new ImageDownloader();
}
TO
public ProdutoAdapter(Produtos context, List<Produto> MyProdutos) {
mInflater = LayoutInflater.from(context);
this.MyProdutos = MyProdutos;
downloader = new ImageDownloader();
mContext = context;
}
而且添加:
private Produtos mContext;
而且變化:
firstClass.showProdutoDialog();
TO
mContext.showProdutoDialog();
感謝傢伙。 是的,第一類是Produtos Acativity的參考。 我做出改變,現在我有這樣的錯誤: android.view.WindowManager $ BadTokenException:無法添加窗口 - 令牌null不是一個應用程序 在線: dialog.show(); 我搜索這個錯誤,但我無法修復。 –
我從另一個線程拷貝了它:你不能通過一個不是Activity的Context來顯示應用程序窗口/對話框。請檢查,每次你開始一個對話框,它會得到正確的上下文。 –
非常感謝Uriel。你有任何建議來解決這個問題?我是一個初學者,我不能以另一種方式思考。 –