Android 以编程方式添加按钮时出现问题
实际上,我以编程方式添加了一些按钮,没有任何问题。之后,我需要重新创建按钮并删除旧按钮。我还为每个按钮设置了OnClickListener。我的问题是,当我调用funcrion refresh()并重新创建按钮时,成功添加了按钮,但当我单击按钮时,程序崩溃了!:|Android 以编程方式添加按钮时出现问题,android,onclicklistener,Android,Onclicklistener,实际上,我以编程方式添加了一些按钮,没有任何问题。之后,我需要重新创建按钮并删除旧按钮。我还为每个按钮设置了OnClickListener。我的问题是,当我调用funcrion refresh()并重新创建按钮时,成功添加了按钮,但当我单击按钮时,程序崩溃了!:| Main Class: package com.example.mysqlex; import com.example.mysqlex.DbHandler; import com.example.mysqlex.DbH
Main Class:
package com.example.mysqlex;
import com.example.mysqlex.DbHandler;
import com.example.mysqlex.DbHelper;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Context;
@SuppressLint("ResourceAsColor")
public class Main extends Activity {
static String Totalresult;
static LinearLayout Llayout,mainRel;
static TextView titleTest;
private static Context context;
private Typeface font;
private DbHandler dbHandler=new DbHandler(this);
public DbHelper dbHelper=new DbHelper(this);
private SQLiteDatabase database;
public static boolean haveNetworkConnection() {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainRel=(LinearLayout) findViewById(R.id.mainRel);
Typeface font = Typeface.createFromAsset(getAssets(),"fonts/yekan2.TTF");
TextView title=(TextView) findViewById(R.id.title);
title.setTypeface(font);
context=this;
if(dbHandler.getSettings("catlist", "value")=="null"){
Toast.makeText(getApplicationContext(), "اطلاعاتی ذخیره نشده است.لطفا نوسازی کنید...", 5000).show();
}else{
refresh("home");
}
}
public void refresh(String refreshType){
dbHandler=new DbHandler(context);
dbHelper=new DbHelper(context);
if(refreshType=="button"){
if(dbHandler.getSettings("catlist", "value")=="null"){
dbHandler.insertSettings("catlist", Totalresult, "");
}else{
dbHandler.updateSettings("catlist", Totalresult, "");
}
}else if(refreshType=="home"){
Totalresult=dbHandler.getSettings("catlist", "value");
}
Typeface font = Typeface.createFromAsset(context.getAssets(),"fonts/yekan2.TTF");
String[] childs=Totalresult.split("/.../<br />");
mainRel.removeAllViews();
for(int i=0; i<childs.length; i++){
String[] parts=childs[i].split("<br />");
final String[] values=parts[1].split("->");
final String[] id=parts[0].split("->");
Button btn = new Button(context);
LinearLayout Llayout = new LinearLayout(context);
btn.setBackgroundResource(R.drawable.cat_drawable);
btn.setHeight(110); btn.setTextSize(24); btn.setTypeface(font); btn.setTextColor(R.color.white);
btn.setId(i);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Intent goToContent = new Intent(Main.this, Content.class);
goToContent.putExtra("catid", id[1]);
goToContent.putExtra("pageTitle", values[1]);
startActivity(goToContent);
}
});
LayoutParams btnLp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams LLp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
LLp.setMargins(0, 5, 0, 5);
btn.setLayoutParams(btnLp);
Llayout.setLayoutParams(LLp);
btn.setText(values[1]);
Llayout.addView(btn);
mainRel.addView(Llayout);
}
}
public void refresh_btn(View v) {
if(haveNetworkConnection()){
SigninActivity.classReferrer="Main";
new SigninActivity(this,0).execute("site_id","1","catlist","1","data_type","echo(/.../)");
}else{
Toast.makeText(getApplicationContext(), "لطفا جهت نوسازی اطلاعات،به اینترنت متصل شوید", Toast.LENGTH_LONG).show();
}
}
}
SigninActivity Class :
package com.example.mysqlex;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.ref.WeakReference;
import java.lang.reflect.Array;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.TextView;
import android.widget.Toast;
public class SigninActivity extends AsyncTask<String,Void,String>{
private ProgressDialog pdia;
String url="http://www.pbroilgas.com/index2.php";
private TextView roleField;
private Context context;
private int byGetOrPost = 0;
static public String results,classReferrer;
static public String[] resultArray;
//flag 0 means get and 1 means post.(By default it is get.)
public SigninActivity(Context context,int flag) {
this.context = context;
byGetOrPost = flag;
}
protected void onPreExecute(){
pdia = new ProgressDialog(context);
pdia.setMessage("در حال نوسازی اطلاعات...");
pdia.setProgressStyle(pdia.STYLE_SPINNER);
pdia.show();
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
if(byGetOrPost == 0){ //means by Get Method
try{
String command1 = (String)arg0[0];
String value1 = (String)arg0[1];
StringBuilder link = new StringBuilder();
link.append(url+"?"+command1+"="+value1);
for(int i=2; i<arg0.length; i+=2){
link.append("&"+arg0[i]);
link.append("="+arg0[i+1]);
}
URL url = new URL(link.toString());
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link.toString()));
HttpResponse response = client.execute(request);
BufferedReader in = new BufferedReader
(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
return sb.toString();
}catch(Exception e){
return new String("Exception: " + e.getMessage());
}
}
else{
try{
String command = (String)arg0[0];
String value = (String)arg0[1];
String link=url;
String data = URLEncoder.encode(command, "UTF-8")
+ "=" + URLEncoder.encode(value, "UTF-8");
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter
(conn.getOutputStream());
wr.write( data );
wr.flush();
BufferedReader reader = new BufferedReader
(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
sb.append(line);
break;
}
return sb.toString();
}catch(Exception e){
return new String("Exception: " + e.getMessage());
}
}
}
@Override
protected void onPostExecute(String result){
pdia.dismiss();
results=result;
if(classReferrer=="Main"){
Main main= new Main();
Main.Totalresult=result.toString();
main.refresh("button");
}else if(classReferrer=="Content"){
Content content= new Content();
Content.Totalresult=result.toString();
content.refresh("button");
}
}
}
Main类:
包com.example.mysqlex;
导入com.example.mysqlex.DbHandler;
导入com.example.mysqlex.DbHelper;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.database.sqlite.SQLiteDatabase;
导入android.graphics.Typeface;
导入android.graphics.drawable.drawable;
导入android.net.ConnectivityManager;
导入android.net.NetworkInfo;
导入android.os.Bundle;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup.LayoutParams;
导入android.widget.Button;
导入android.widget.LinearLayout;
导入android.widget.ScrollView;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.content.Context;
@SuppressLint(“资源色”)
公共类主要扩展活动{
静态字符串结果;
静态线性布置图,主线;
静态文本视图标题测试;
私有静态语境;
专用字体;
私有DbHandler=newdbhandler(this);
public DbHelper DbHelper=新的DbHelper(this);
专用数据库;
公共静态布尔haveNetworkConnection(){
布尔值haveConnectedWifi=false;
布尔haveConnectedMobile=false;
ConnectivityManager cm=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_服务);
NetworkInfo[]netInfo=cm.getAllNetworkInfo();
对于(网络信息ni:netInfo){
if(ni.getTypeName().equalsIgnoreCase(“WIFI”))
如果(ni.isConnected())
haveConnectedWifi=true;
if(ni.getTypeName().equalsIgnoreCase(“移动”))
如果(ni.isConnected())
haveConnectedMobile=true;
}
返回haveConnectedWifi | | haveConnectedMobile;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainRel=(LinearLayout)findViewById(R.id.mainRel);
Typeface font=Typeface.createFromAsset(getAssets(),“font/yekan2.TTF”);
TextView title=(TextView)findViewById(R.id.title);
标题.设置字体(字体);
上下文=这个;
if(dbHandler.getSettings(“catlist”,“value”)=“null”){
Toast.makeText(getApplicationContext(),“Toast.makeText(),”Toast;
}否则{
刷新(“主页”);
}
}
公共无效刷新(字符串刷新类型){
dbHandler=新的dbHandler(上下文);
dbHelper=新的dbHelper(上下文);
如果(刷新类型==“按钮”){
if(dbHandler.getSettings(“catlist”,“value”)=“null”){
插入设置(“catlist”,Totalresult,”);
}否则{
updateSettings(“catlist”,Totalresult,”);
}
}else if(refreshType==“home”){
Totalresult=dbHandler.getSettings(“catlist”、“value”);
}
Typeface font=Typeface.createFromAsset(context.getAssets(),“font/yekan2.TTF”);
字符串[]childs=Totalresult.split(“/…/
”);
mainRel.removeAllViews();
对于(int i=0;i,错误表示无法获取包名。因此,由于某些原因,Main.this在该点无效。请将其更改为:
public void onClick(View arg0) {
Intent goToContent = new Intent(arg0.getContext(), Content.class);
goToContent.putExtra("catid", id[1]);
goToContent.putExtra("pageTitle", values[1]);
startActivity(goToContent);
}
您有一个无效的上下文引用,但是调用该方法的视图永远不应该无效。查看源代码中的意图(上下文,类)
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
使用new
无法创建活动的实例
-它根本不起作用,这就是Main的原因。此为null
你将不得不重新思考,因为你不应该试图从任何其他应用程序组件访问活动的任何变量或方法
如果您需要从异步任务
访问活动
中的方法,最简单的方法是将异步任务
设置为活动
本身的内部类。childs.length
是否有值?这是一个空指针异常…所以可能是空的?谢谢回复兄弟…当然。我的问题是onClickListener在设置的秒时间内不工作btn@gurinderhans如果它是空的,那么按钮视图不应该添加到视图中..对吗?那么它不是空的..没错!你能指定它在哪一行给出错误吗?愚蠢的问题,但是那是刷新(…)
方法是名为Main
的活动的一部分
谢谢你的回答,我的朋友。我按照你说的做了,应用程序再次崩溃,但logCat更改如下:08-11 02:50:49.755:E/AndroidRuntime(14203):致命异常:Main 08-11 02:50:49.755:E/AndroidRuntime(14203):java.lang.NullPointerException 08-11 02:50:49.755:E/AndroidRuntime(14203):在android.app.Activity.startActivityForResult(Activity.java:3351)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.app.Activity.startActivityForResult(Activity.java:3312)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.app.Activity.startActivity.startActivity(Activity.java:3522)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.app.Activity.startActivity(Activity.java:3490)08-11 02:50:49.755:E/AndroidRuntime(14203):在com.example.mysqlex.Main$1.onClick(Main.java:102)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.view.view.view.view.performClick(view.java:4147)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.view.view$PerformClick.run(view.java:17161)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.os.Handler.handleCallback(Handler.java:615)08-11 02:50:49.755:E/AndroidRuntime(14203):在android.os.Handler.dispatchMessage(Handler.java:92)08-11 02:
public ComponentName(Context pkg, Class<?> cls) {
mPackage = pkg.getPackageName();
mClass = cls.getName();
}
Main main= new Main();