2015-03-02 1 views
1

Привета Я новичок в AndroidfindViewById() не работает при использовании отдельного класса

Я хотел бы сохранить следующий код seperatly из моего файла MainActivity. Однако, когда я пытаюсь findViewById() внутри отдельного класса, я получаю ошибку

«не может быть решен»

Теперь я знаю, что я не могу расширить класс MainActivity, поскольку это приведет к стек переполнение, но может ли кто-нибудь сказать мне, как сделать доступ к текстовому просмотру из этого отдельного файла?

public class Counter { 

    private TextView tempTextView; 
    //Temporary TextView 
    private Button tempBtn; 
    public Handler mHandler = new Handler(); 
    public long startTime; 
    public long elapsedTime; 
    public final int REFRESH_RATE = 100; 
    public String hours,minutes,seconds,milliseconds; 
    public long secs,mins,hrs,msecs; 
    public boolean stopped = false; 

    public Runnable startTimer = new Runnable() { 
     public void run() { 
      elapsedTime = System.currentTimeMillis() - startTime; 
      updateTimer(elapsedTime); 
      mHandler.postDelayed(this,REFRESH_RATE); 
     } 
    }; 


    private void updateTimer (float time) { 
     secs = (long) (time/1000); 
     mins = (long) ((time/1000)/60); 
     hrs = (long) (((time/1000)/60)/60); /* Convert the seconds to String * and format to ensure it has * a leading zero when required */ 
     secs = secs % 60; 
     seconds = String.valueOf(secs); 
     if (secs == 0) { 
      seconds = "00"; 
     } 
     if (secs < 10 && secs > 0) { 
      seconds = "0" + seconds; 
     } /* Convert the minutes to String and format the String */ 
     mins = mins % 60; 
     minutes = String.valueOf(mins); 
     if (mins == 0) { 
      minutes = "00"; 
     } 
     if (
       mins < 10 && mins > 0 
       ) { 
      minutes = "0" + minutes; 
     } /* Convert the hours to String and format the String */ 
     hours = String.valueOf(hrs); 
     if (hrs == 0) { 
      hours = "00"; 
     } 
     if (hrs < 10 && hrs > 0) { 
      hours = "0" + hours; 
     } 
     /* Although we are not using milliseconds on the timer in this example * I included the code in the event that you wanted to include it on your own */ 
     milliseconds = String.valueOf((long) time); 
     if (milliseconds.length() == 2) { 
      milliseconds = "0" + milliseconds; 
     } 
     if (milliseconds.length() <= 1) { 
      milliseconds = "00"; 
     } 
     milliseconds = milliseconds.substring(milliseconds.length() - 3, milliseconds.length() - 2); 
     /* Setting the timer text to the elapsed time */ 
     // ((TextView) findViewById(R.id.elapsed_value)).setText(hours + ":" + minutes + ":" + seconds); 
     // ((TextView)findViewById(R.id.timerMs)).setText("." + milliseconds); } 

    } 
} 

ответ

1

Потому что findViewById() является методом класса Activity. Вот почему вы не можете использовать его в любом другом классе Java.

И во-вторых, вы не можете обновлять пользовательский интерфейс приложения для Android из любого рабочего потока.

Поэтому лучше использовать AsyncTask и передать ссылки TextView, которые вы хотите обновить после выполнения определенной задачи.

Или используйте runOnMainUiThread(), если вы собираетесь обновить интерфейс приложения от другого рабочего потока. Но убедитесь, что runOnUiThread() работает только с контекстом активности.

2

Вам необходимо раздуть вид и вызвать mehod findViewById() с этой точки зрения. Для того, чтобы раздуть вид, вам нужен контекст (вы можете установить его в пользовательский конструктор)

View view; 
LayoutInflater inflater = (LayoutInflater) yourContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null); 

tempTextView = (TextView) view.findViewById(R.id.tv); 
1

Вы можете создать конструктор, который принимает Counter ссылку на ваш TextView от вашего Activity.

public Counter(TextView tv) { 
    tempTextView = tv; 
} 

Затем вызовите findViewById() на вашем MainActivity в качестве прохода в результате, когда вы инстанцировании Counter.

Вы уже в потоке пользовательского интерфейса, нет необходимости AsyncTask здесь ...

1

Вы можете иметь конструктор, где вы установили переменную активность.

public Counter (MainActivity activity) { 
    mActivity = activity; 
} 

Затем, вы можете позвонить

mActivity.findViewById(...); 

который найдет вид в макете MainActivity, которые вы установили в

setContentView(<layout>);