Android 以编程方式添加按钮时出现问题

Android 以编程方式添加按钮时出现问题,android,onclicklistener,Android,Onclicklistener,实际上,我以编程方式添加了一些按钮,没有任何问题。之后,我需要重新创建按钮并删除旧按钮。我还为每个按钮设置了OnClickListener。我的问题是,当我调用funcrion refresh()并重新创建按钮时,成功添加了按钮,但当我单击按钮时,程序崩溃了!:| Main Class: package com.example.mysqlex; import com.example.mysqlex.DbHandler; import com.example.mysqlex.DbH

实际上,我以编程方式添加了一些按钮,没有任何问题。之后,我需要重新创建按钮并删除旧按钮。我还为每个按钮设置了OnClickListener。我的问题是,当我调用funcrion refresh()并重新创建按钮时,成功添加了按钮,但当我单击按钮时,程序崩溃了!:|

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