【问题标题】:How to call a method in same class from inside oncreate method android?如何从oncreate方法android内部调用同一类中的方法?
【发布时间】:2017-02-08 19:47:40
【问题描述】:

嗨,我是 android 和 java 的新手,我试图在每次单击一个按钮时创建一个三个按钮菜单,另外两个更改其颜色或单击一个突出显示以显示它已被选中但我无法从在 onCreate 中单击时执行特定任务。帮助谢谢`

 public class MainActivity extends AppCompatActivity {

    int PriceList;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = (Button)findViewById(R.id.Coffee);
        Button button2 = (Button)findViewById(R.id.Mocha);
        Button button3 = (Button)findViewById(R.id.Lattee);
        TextView Counter = (TextView)findViewById(R.id.Counters);

           mClick(button1,button2,button3)
           mClick(button2,button1,button3)
           mClick(button3,button2,button1)

           Counter.setText(Item()); //Counter is a TextVew, This code doesn't work   

              }

           **/*------------METHODS----------------*/**

     public int TotalValue(int param5){

                if(param5 == 2131427416){   //just Trying to compare with id value 

                 Item();

               Log.d("Item Value " , "onCreate: The value is " + Item()); // works upto here i.e Item()=1

                 } else{
                  // some other code here
                 }
           }

     public int Item(){

          PriceList = 1;

          return PriceList;
         }              

      public void mClick(final Button param1,final Button param2,final Button param3){
            param1.setOnClickListener(new View.OnClickListener() {
             @Override
            public void onClick(View view){
                param2.setBackgroundColor(Color.rgb(192,110,99));
                param3.setBackgroundColor(Color.rgb(192,110,99));

                int IdNum = param1.getId()

                TotalValue(IdNum);

              }
    });
    }
    }
}

【问题讨论】:

  • 1.您的代码无法编译。 2.你在哪里定义button1,button2和button3。即使代码可以编译,您也会收到 NullPointerException,因为您的按钮未在代码中定义

标签: java android oncreate


【解决方案1】:

您不能在方法中定义方法:

public class Example {
  void foo() {
    void bar() { }
  }

不工作!去:

public class Example {
  void foo() {
  }
  void bar() { }

改为。

除此之外,要理解的另一个基本问题是,为了让多个方法对相同的变量起作用,这些变量需要是您的类的字段,例如:

public class Example {
  private Button button1

  void onCreate() {
   ...
    button1 = (Button) findViewById(R.id.button1);
   ...
  }

  void foo() {         
   do something with button1
  }

【讨论】:

  • 我还是不明白,请解释一下?
  • @Misterrai 我更新了我的答案,并认真阅读了另一个答案。
  • 谢谢,我知道了,实际上我认为我在导致问题的 mclick 方法中定义了 onclick 方法。
【解决方案2】:

旧答案

你的问题是关于button's initializations:

你打电话给MyMethod(mybutton1, mybutton2, mybutton3);

但您从未初始化您的 buttons,因此它们将始终为 null

TextView 也是如此。

在 Android 中,您必须像下面这样调用 init:

public void onCreate(...){

  Button button1 = (Button)findViewById(R.id.Coffee);
  Button button2 = (Button)findViewById(R.id.Mocha);
  Button button3 = (Button)findViewById(R.id.Lattee);
  TextView Counter = (TextView) findViewById(R.id.Counters);

  mClick(button1,button2,button3);
  mClick(button2,button1,button3);
  mClick(button3,button2,button1);

  Counter.setText(Item()); //Counter is a TextVew, This code doesn't work   

}

Check for those videos on youtube,它们是安卓初学者的最佳选择imho

祝你好运!有什么帮助我在这里

改进:

这就是您的代码应有的样子。请记住格式化代码以便更好地理解:

public class MainActivity extends AppCompatActivity {

  private int priceList;
    
  @Override
  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button1 = (Button)findViewById(R.id.button1);
    Button button2 = (Button)findViewById(R.id.button2);
    Button button3 = (Button)findViewById(R.id.button3);
    TextView counter = (TextView)findViewById(R.id.Counter);

    mClick(button1,button2,button3)
    mClick(button2,button1,button3)
    mClick(button3,button2,button1)

    counter.setText(Item()); //Dont' use capital letters for variable's name
  }

           **/*------------METHODS----------------*/**

  public int TotalValue(int param5){

    if(param5 == 2131427416){   //just Trying to compare with id value 
      Item();
      Log.d("Item Value " , "onCreate: The value is " + Item()); // works upto here i.e Item()=1

    } else{
      // some other code here
    }
  }

  public int Item(){
    priceList = 1;
    return priceList;
  }              

  public void mClick(final Button param1,final Button param2,final Button param3){
    param1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view){
        param2.setBackgroundColor(Color.rgb(192,110,99));
        param3.setBackgroundColor(Color.rgb(192,110,99));
        int idNum = param1.getId()
        TotalValue(idNum);
      }
    });
  }
}

有几点:

  • 末尾有一个额外的右大括号
  • (约定)不要用大写的 lecter 调用变量
  • 我没有更改您的方法名称和变量名称,但考虑使用更明确的名称(仍然是一种约定,但为了更好地理解)
  • 在方法调用后您没有;

改进的更新:

mClick(..) 调用之后,您错过了;

【讨论】:

  • 对不起,我之前没有添加完整的代码,再次编辑它我已经定义了所有按钮和 TextView 对象仍然不起作用,请再看看
  • @Misterrai 检查编辑的代码并尝试运行它。如果它给你任何错误,请发布它
【解决方案3】:

根据我对您想要什么的理解,您可以使用它

public class LoginActivity extends AppCompatActivity {

    int PriceList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button button1 = (Button) findViewById(R.id.Coffee);
        final Button button2 = (Button) findViewById(R.id.Mocha);
        final Button button3 = (Button) findViewById(R.id.Lattee);
        TextView Counter = (TextView) findViewById(R.id.Counters);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                button2.setBackgroundColor(Color.rgb(192, 110, 99));
                button3.setBackgroundColor(Color.rgb(192, 110, 99));
                int IdNum = button1.getId();
                TotalValue(IdNum);

            }
        });
        Counter.setText(Item()); //Counter is a TextVew, This code doesn't work
    }

    public int TotalValue(int param5) {
        if (param5 == 2131427416) {   //just Trying to compare with id value
            Item();
            Log.d("Item Value ", "onCreate: The value is " + Item()); // works upto here i.e Item()=1
        } else {
            // some other code here
        }
        return 0;
    }

    public int Item() {
        PriceList = 1;
        return PriceList;
    }
}

如果没有,请评论确切的需要,以便我可以提供帮助

【讨论】:

  • 感谢您的帮助,但我认为这可能不起作用,因为如果我单击 button1 有效,但不适用于其他按钮(button2 和 button3)。使用参数背后的主要思想是每次更改 button1 的值。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多