Android从onClick生成新对象

时间:2015-03-27 14:46:40

标签: android onclicklistener

我尝试使用一个Button开发一个简单的Android应用,每次点击都会生成新的TextViews

 import android.app.Activity;
 import android.os.Bundle;
 import android.text.Layout;
 import android.view.View;
 import android.widget.Button;
 import android.widget.TextView;

 public class CreateTV extends Activity {

    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);
       Button mCreate = (Button)findViewById(R.id.btnCreate);

       mCreate.setOnClickListener(new View.OnClickListener() {

       @Override
       public void onClick(View v) {
            // TODO Auto-generated method stub
            ((Button) v).setText("Clicked");
            TextView mTV1 = new TextView(this);
       }
   });
 }
}

我的代码错误是因为:

               TextView mTV1 = new TextView(this);

我可以找到some similar examples,它在onCreate()中以编程方式生成对象。但我想在onClick()中生成和修改新对象。 请问有人帮忙吗?

4 个答案:

答案 0 :(得分:2)

更改

TextView mTV1 = new TextView(this);

TextView mTV1 = new TextView(CreateTV.this);

答案 1 :(得分:1)

视图只能使用上下文作为参数

进行实例化

正如您在documentation中所看到的,TextView需要创建上下文。 TextView(Context context)

由于您尝试在TextView内创建ClickListener,因此无法使用this作为对Context扩展对象的引用。

正如McAdam331指出的那样,使用new TextView(getActivity),这是有效的,因为Activity扩展了Context

答案 2 :(得分:0)

除了将TextView mTV1 = new TextView(this);更改为TextView mTV1 = new TextView(CreateTV.this);之外,您还必须在TextView中添加view,如下所示:

import android.app.Activity;
import android.os.Bundle;
import android.text.Layout;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class CreateTV extends Activity {

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   setContentView(R.layout.main);
   Button mCreate = (Button)findViewById(R.id.btnCreate);

   mCreate.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {
        // TODO Auto-generated method stub
        ((Button) v).setText("Clicked");
        TextView mTV1 = new TextView(CreateTV.this);
        addContentView(mTV1);
   }
});
}
}

答案 3 :(得分:0)

我更希望添加一个Context,将其设置为final,然后使用Context调用Textview。

示例:

public class CreateTV extends Activity {

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   setContentView(R.layout.main);
   Button mCreate = (Button)findViewById(R.id.btnCreate);

   final Context mContext = this;
   mCreate.setOnClickListener(new View.OnClickListener() {


   @Override
   public void onClick(View v) {
        // TODO Auto-generated method stub
        ((Button) v).setText("Clicked");
        TextView mTV1 = new TextView(mContext);
        addContentView(mTV1);
   }
});
}
}

如果要在onCreate方法之外(以及在Listeners中)使用Context,可以定义一个Context。

 private Context context;
 public void onCreate(....) {
   this.context = this;
 }

private void aMethod() {
  context....
}

另一种方式做这么酷的东西。创建一个类并通过Application扩展它。

public class MainApplication extends Application {
       public static Context getContext() { return this; }
}

然后将MainApplication添加到您的Manifest。

<application
    android:name=".MainApplication"
 >

使用MainApplication.getContext();

从任何地方访问它