【问题标题】:Add button to a layout programmatically以编程方式将按钮添加到布局
【发布时间】:2011-02-05 15:13:22
【问题描述】:

我在向用 XML 创建的布局添加按钮时遇到问题。这是我想要实现的目标:

//some class
else {
        startActivity(new Intent(StatisticsScreen.this, ScreenTemperature.class));
}
////

//ScreenTemperatureClass
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //this is where I call another class that
    //displays a nice graph
    setContentView(new GraphTemperature(getApplicationContext()));

}

我想在这个新屏幕上添加一个Button,这样它就会出现在图表下方。 我尝试创建一个LinearLayout 视图,然后创建一个Button 并将其添加到此视图中,但我只得到NullPointerExceptions..

任何帮助将不胜感激。谢谢

编辑#1

这是我尝试使用的创建 NullPointerException 和“强制关闭”的方法:

Button buybutton;
LinearLayout layout;

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

    setContentView(new GraphTemperature(getApplicationContext()));

    layout = (LinearLayout) findViewById(R.id.statsviewlayout);
    Button buyButton = new Button(this);
    buyButton.setText(R.string.button_back);
    buyButton.setLayoutParams(new LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.addView(buyButton);

}

这是 logcat 错误:

ERROR/AndroidRuntime(293): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.weatherapp/com.weatherapp.ScreenTemperature}: java.lang.NullPointerException
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
ERROR/AndroidRuntime(293):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)

logcat 中有更多行与此错误有关,不确定是否需要?

编辑#2

所以我尝试了 bhups 方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GraphTemperature GT = new GraphTemperature(getApplicationContext());             
    layout = (LinearLayout) findViewById(R.id.statsviewlayout);
    Button buyButton = new Button(this);
    buyButton.setText(R.string.button_back);
    buyButton.setLayoutParams(new LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.addView(GT); // line 27
    layout.addView(buyButton);       
    setContentView(layout);           
}

这个方法产生了和上面一样的 logcat 错误,NullPointerException,表明它与行号有关。 27 是 layout.addView 代码行。有任何想法吗?再次感谢

【问题讨论】:

  • 向我们展示您尝试了什么以及您运行的 logcat,因此我们尝试找出您获得 npe 的原因。无论如何考虑创建一个screen_temperature.xml 布局并在setContentView() 中使用它。您也可以通过指定整个包来在 xml 中添加您的自定义视图,而不仅仅是名称(即:<my.package.MyCustomView android:id.../>
  • 创建一个线性布局(ll)并将GraphTemp视图对象和按钮对象添加到ll。然后将活动的内容视图设置为ll。即 setContentView(ll);

标签: android button android-activity


【解决方案1】:

如果您刚刚在 onCreate() 的开头包含了一个布局文件,并希望在 setContentView 中使用此布局以通过编程方式添加新元素,请尝试以下操作:

ViewGroup linearLayout = (ViewGroup) findViewById(R.id.linearLayoutID);

然后您可以创建一个新的Button 并添加它:

Button bt = new Button(this);
bt.setText("A Button");
bt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                                    LayoutParams.WRAP_CONTENT));
linerLayout.addView(bt);

【讨论】:

  • FILL_PARENT 已弃用,在 API 级别 8 及更高版本中重命名为 MATCH_PARENT。
【解决方案2】:

这一行:

layout = (LinearLayout) findViewById(R.id.statsviewlayout);

在您当前的“内容视图”中查找“statsviewlayout”ID。现在你已经在这里设置了:

setContentView(new GraphTemperature(getApplicationContext()));

而且我猜测新的“graphTemperature”没有设置任何具有该 ID 的内容。

认为您可以使用 findViewById 找到任何视图是一个常见的错误。您只能找到 XML 中的视图(或由代码指定并给定 id)。

空指针会被抛出,因为你要找的布局没有找到,所以

layout.addView(buyButton);

抛出该异常。

补充: 现在,如果您想从 XML 中获取该视图,则应该使用 inflater:

layout = (LinearLayout) View.inflate(this, R.layout.yourXMLYouWantToLoad, null);

假设您的线性布局位于名为“yourXMLYouWantToLoad.xml”的文件中

【讨论】:

  • 你能看看我的第二次编辑吗?我几乎在您发布此答案的同时发布了它。我不太确定我是否理解。布局“statsviewlayout”在 xml 中声明,如果这就是您的要求?
  • 在看到您的添加后就可以了。我试试看 :-) 谢谢
  • 你似乎还在这样做:` layout = (LinearLayout) findViewById(R.id.statsviewlayout);` 只要你的,由于缺乏更好的词,屏幕上的当前视图(你在setcontentview中设置的东西不包含这个id,你不能这样做。只要包含'statsviewlayout'的xml没有使用setcontentview设置'findviewbyid`将返回null
  • 哈哈,我们似乎在评论/阅读彼此的修订/添加;)
  • 是的!好的,所以我已经摆脱了“layout = (LinearLayout) findViewById(R.id.statsviewlayout);”代码行并将其更改为您所说的。它有效,没有错误或任何东西。唯一的问题是,由于图表占据了设备的整个屏幕(我使用的是模拟器),我不确定按钮是否真的在图表下方。要解决这个问题,我只需将线性布局更改为滚动视图还是什么?再次感谢南尼!编辑对不起,我的意思是在线性布局中添加一个滚动视图..
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2014-04-26
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多