2014-11-13 79 views
1

我一直在使用本教程here來創建時間選擇器。我可以選擇正確的時間,但是我無法獲得選擇顯示在我的TextView中的時間。 Java不是我的首選語言,所以這可能是我墮落的地方。將TextView設置爲TimePicker的時間 - Android

這裏是我的Java代碼:

import android.app.Activity; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.app.TimePickerDialog; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.TimePicker; 

import java.util.Calendar; 


public class MainActivity extends Activity { 

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

    //code from: http://developer.android.com/guide/topics/ui/controls/pickers.html 
    public void showTimePicker(View v) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getFragmentManager(), "timePicker"); 
    } 

    public static class TimePickerFragment extends DialogFragment 
      implements TimePickerDialog.OnTimeSetListener { 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 

      // Use the current time as the default values for the picker 
      final Calendar c = Calendar.getInstance(); 
      int hour = c.get(Calendar.HOUR_OF_DAY); 
      int minute = c.get(Calendar.MINUTE); 

      // Create a new instance of TimePickerDialog and return it 
      return new TimePickerDialog(getActivity(), this, hour, minute, 
        DateFormat.is24HourFormat(getActivity())); 
     } 

     public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
      // Do something with the time chosen by the user - how!? 
     } 
    } 
} 

在我的XML我有選擇時間按鈕上點擊運行showTimePicker方法,像這樣:

android:onClick="showTimePicker" 

我曾嘗試只需設置onTimeSet方法內的文本字段,但我得到一個nullpointerexception。然後我想我應該在onCreateDialog中初始化它,但是我不知道如何使用findViewById來查找實際的文本視圖。我相信這可能很簡單,但我已經搜索了上下沒有運氣。謝謝你的幫助!

回答

2

你可以做這樣的:

1)解決方案1 ​​更好):

public class MainActivity extends Activity { 

     TextView resultText; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      resultText = (TextView)findViewById(R.id./*YOUR TEXT VIEW ID*/); 
     } 

     //code from: http://developer.android.com/guide/topics/ui/controls/pickers.html 
     public void showTimePicker(View v) { 
      DialogFragment newFragment = new TimePickerFragment(resultText); 
      newFragment.show(getFragmentManager(), "timePicker"); 
     } 

     public class TimePickerFragment extends DialogFragment 
       implements TimePickerDialog.OnTimeSetListener { 

      TextView mResultText; 

      public TimePickerFragment(TextView textView) { 
       mResultText = textView; 
      } 

      @Override 
      public Dialog onCreateDialog(Bundle savedInstanceState) { 

       // Use the current time as the default values for the picker 
       final Calendar c = Calendar.getInstance(); 
       int hour = c.get(Calendar.HOUR_OF_DAY); 
       int minute = c.get(Calendar.MINUTE); 

       // Create a new instance of TimePickerDialog and return it 
       return new TimePickerDialog(getActivity(), this, hour, minute, 
         DateFormat.is24HourFormat(getActivity())); 
      } 

      public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
       String time = /*CONVERT YOUR TIME FROM hourOfDay and minute*/; 
       mResultText.setText(time); 
      } 
     } 
    } 

2)解決方案2

public class MainActivity extends Activity { 
    public TextView mResultText; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mResultText = (TextView)findViewById(R.id./*YOUR TEXT VIEW ID*/); 
    } 

    //code from: http://developer.android.com/guide/topics/ui/controls/pickers.html 
    public void showTimePicker(View v) { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getFragmentManager(), "timePicker"); 
    } 

    public class TimePickerFragment extends DialogFragment 
      implements TimePickerDialog.OnTimeSetListener { 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 

      // Use the current time as the default values for the picker 
      final Calendar c = Calendar.getInstance(); 
      int hour = c.get(Calendar.HOUR_OF_DAY); 
      int minute = c.get(Calendar.MINUTE); 

      // Create a new instance of TimePickerDialog and return it 
      return new TimePickerDialog(getActivity(), this, hour, minute, 
        DateFormat.is24HourFormat(getActivity())); 
     } 

     public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
      String time = /*CONVERT YOUR TIME FROM hourOfDay and minute*/; 
      mResultText.setText(time); 
     } 
    } 
} 
+0

爲什麼說解決方案1更好?我會說2更好,因爲你只需要搜索TextView一次;它更有效率。 –

+0

@NathanWalters如果我們談論你的表現你是對的,sol 2更好。如果他(或其他用戶)想在活動外部創建「TimePickerFragment.class」,我已經選擇sol 1作爲更好的選擇。無論如何,我會更新我的sol 1以提高效率,並感謝您的評論:) – Rami

+0

啊,是的,我沒有考慮過這種情況。在這種情況下,你可以把''''''''''''''''''''''移動到'''onCreate()'''中。然後你可以獲得更多模塊化代碼的好處*和*性能提升! –

0

你可以實際使用findViewById,與一樣10您的片段可以訪問正在運行的活動,從而訪問活動中的視圖。

public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    TextView textView = (TextView) getActivity().findViewById(R.id.my_text_view); 
    textView.setText(String.format("%02d", hourOfDay), String.format("%02d", minute); 
} 

這個簡單的解決方案應該優於傳遞到TextView到片段的參考,因爲這將參考在片段的重新實例(見comment)丟失。

相關問題