2016-10-06 1 views
1

Итак, я дал себе домашнее задание: создайте класс для вычисления и верните эту переменную в MainActivity для отображенияКак этот TextView может быть Null?

Я думал, что это будет просто, но по какой-то причине мой TextView всегда имеет значение null. Когда я пытался воссоздать ошибку в новом файле, я не получаю ошибку с TextView - я могу установить ее просто отлично.

Я записал значения, когда код запускается, поэтому кажется, что переменные правильно передают данные. Но в тот момент, когда я пытался подтолкнуть ЛЮБОЕ значение в свой textView, я получаю ошибку.

Здесь:

package com.kserrattan.clickerdemo001; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

import org.w3c.dom.Text; 


public class MainActivity extends ActionBarActivity { 

String countString; 
TextView displayCount; 
View parent; 

public void playerTapped(View view) { 

    MathCalculations mathCalculations = new MathCalculations(); 
    //parent = (View) view.getRootView(); 
    mathCalculations.addCount(); 

} 

public void getCount(int count) { 

    Log.i("addCount", Integer.toString(count)); 
    countString = (Integer.toString(count)); 
    displayString(); 

} 

public void displayString() { 

    displayCount.setText("HIE"); 

} 

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

    displayCount = (TextView) findViewById(R.id.countText); 


} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

SecondClass:

package com.kserrattan.clickerdemo001; 

import android.util.Log; 

/** 
* Created by Kris on 05/10/2016. 
*/ 
public class MathCalculations { 

int tapCounter; 

public void addCount() { 

    Log.i("addCount", "HERE"); 
    tapCounter += 1; 
    MainActivity mainActivity = new MainActivity(); 
    mainActivity.getCount(tapCounter); 

} 

} 

Я могу только обеспечить часть ошибки, потому что по какой-то неизвестной причине остальные ошибки не форматирования правильно! Надеюсь, этого бита достаточно ...:

--------- beginning of crash 
10-05 20:00:51.640 2375-2375/com.kserrattan.clickerdemo001  E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.kserrattan.clickerdemo001, PID: 2375 
java.lang.IllegalStateException: Could not execute method of the activity 
     at android.view.View$1.onClick(View.java:4007) 
     at android.view.View.performClick(View.java:4756) 
     at android.view.View$PerformClick.run(View.java:19749) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.lang.reflect.InvocationTargetException 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at android.view.View$1.onClick(View.java:4002) 
+0

Вы не должны создавать «Активность» самостоятельно. Удалите этот код: MainActivity mainActivity = new MainActivity(); ' – nandsito

+0

Что мне делать после его удаления? Я хочу понять, почему я не должен делать то, что я сделал ... но ваш короткий ответ не заставил меня понять. –

ответ

0

Марка ваш TextView в качестве статической переменной в MainActivity

public class MainActivity extends ActionBarActivity { 

    String countString; 
    public static TextView displayCount; 
    View parent; 

    public void playerTapped(View view) { 

    MathCalculations mathCalculations = new MathCalculations(); 
    //parent = (View) view.getRootView(); 
    mathCalculations.addCount(); 

    } 

    public static void getCount(int count) { 

    Log.i("addCount", Integer.toString(count)); 
    countString = (Integer.toString(count)); 
    displayString(); 

    } 

    public static void displayString() { 

    displayCount.setText("HIE"); 

    } 

    //... 
} 

Статическая переменная будет собирать мусор после закрытия приложения

+0

Это работало без проблем, спасибо за решение. Я посмотрю некоторые ресурсы о том, почему он работает; но, сможете ли вы разработать или направить меня на ресурс? –

+0

Я читал немного больше в этой теме: (http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class), и я понимаю, почему это работает сейчас, еще раз спасибо ;) –

0

Для вызова метода требуется контекст активности. Создайте значение контекста в методе OnCreate:

public class MainActivity extends ActionBarActivity { 

String countString; 
TextView displayCount; 
View parent; 
Context mContext; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mContext = this; 
    displayCount = (TextView) findViewById(R.id.countText); 
} 

Затем пройти этот контекст при вызове addCount():

public void playerTapped(View view) { 
    MathCalculations mathCalculations = new MathCalculations(); 
    //parent = (View) view.getRootView(); 
    mathCalculations.addCount(mContext); 
} 

Измените addCount() использовать контекст:

public void addCount(Context mContext) { 
    Log.i("addCount", "HERE"); 
    tapCounter += 1; 
    mContext.getCount(tapCounter); 
} 
+0

Я сделал вышеупомянутые изменения, и имеет смысл передать контекст на этом пути, но добавление «mContext.getCount» делает «getCount» неразрешенным. Я пытаюсь понять, почему, не могли бы вы уточнить? –