声明的方式和位置可以在Android Studio中使用两种方法

时间:2015-11-22 00:27:19

标签: java android-studio

我是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.

2 个答案:

答案 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("****");
}
}