我是Java和Android Studio的新手,所以我还在学习,如果这个问题过于简单,那就很抱歉。我最近发现,作为对activity.java文件中的onClickListener进行编码以替代按钮单击的替代方法,可以使用android:onClick =" 方法名称更简单地完成它"在相应的layout.xml文件中。我已经看过这个网站关于每种方法的优缺点的问题,但这不是我的问题。我的问题是,在哪里以及如何声明两个方法使用的文本字段而不必在每个方法中声明它? 随后的代码尽可能少。有两个按钮和一个文本视图。如果我尝试将" TextView themessage =(TextView)findViewById(R.id.message);"除了两种方法之外的其他地方,我得到了可怕的"尝试调用虚方法' android.view.View android.view.Window.findViewById(int)'在null对象引用"。 是否有任何方法可以使两个方法都使用单个声明而不会产生此异常?
从.xml文件中提取
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me"
android:id="@+id/topbutton"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="88dp"
android:onClick="doit"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="***"
android:id="@+id/message"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Again"
android:id="@+id/againbutton"
android:layout_below="@+id/message"
android:layout_centerHorizontal="true"
android:layout_marginTop="63dp"
android:onClick="starit"/>
.java文件的高端摘录
package com.example.owner.clickme;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doit (View v)
{
TextView themessage = (TextView) findViewById(R.id.message);
themessage.setText("Well clicked, Sir!");
}
public void starit (View v)
{
TextView themessage = (TextView) findViewById(R.id.message);
themessage.setText("****");
}
.
. etc.
答案 0 :(得分:2)
Android中的常见做法是在onCreate
内实例化任何视图,或者在主要内容视图中充气。
所以,在MainActivity
之内创建一个字段
private TextView themessage;
在onCreate
内获取TextView
theMessage = (TextView) findViewById(R.id.message);
然后您可以在两种方法中使用theMessage
。
总而言之,它看起来像这样
public class MainActivity extends AppCompatActivity
{
private TextView themessage;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
themessage = (TextView) findViewById(R.id.message);
}
public void doit (View v)
{
themessage.setText("Well clicked, Sir!");
}
public void starit (View v)
{
themessage.setText("****");
}
}
答案 1 :(得分:1)
我认为您想要做的是将TextField作为您的活动类的成员。
可能是这样的东西
public class MainActivity extends AppCompatActivity {
TextView theMessage;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
theMessage = (TextView) findViewById(R.id.message);
}
public void doit () {
theMessage.setText("Well clicked, Sir!");
}
public void starit() {
themessage.setText("****");
}
}