【问题标题】:Android generate new objects from onClickAndroid 从 onClick 生成新对象
【发布时间】:2015-03-27 14:46:40
【问题描述】:

我尝试使用一个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() 中生成和修改新对象。 有人可以帮忙吗?

【问题讨论】:

  • (this) 不起作用的原因是因为您在按钮的onClick 方法中,所以“this”指的是点击监听器,而不是活动。尝试将其更改为new TextView(getActivity()),看看它的工作方式是否不同。
  • 使用CreateTV.this

标签: android onclicklistener


【解决方案1】:

改变

TextView mTV1 = new TextView(this);

TextView mTV1 = new TextView(CreateTV.this);

【讨论】:

    【解决方案2】:

    视图只能以上下文作为参数来实例化

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我更喜欢添加一个 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 方法之外(以及在侦听器内)使用 Context,您可以定义一个 Context。

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

        还有另一种方法可以做如此酷的事情。创建一个类并通过应用程序扩展它。

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

        然后将 MainApplication 添加到您的清单中。

        <application
            android:name=".MainApplication"
         >
        

        并使用 MainApplication.getContext() 从任何地方访问它;

        【讨论】:

        • 太酷了!基于这种方法,应该可以解决多布局应用程序中的不同布局;我的意思是为每个布局定义单独的类并在每个类中定义公共上下文。那么就可以通过一键将对象添加到不同的布局中,不是吗?
        • 不。如果您在扩展 Application 的类中定义它,则不会
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        • 2013-07-21
        • 1970-01-01
        相关资源
        最近更新 更多