<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:layout_weight="1" android:id="@+id/urlText" android:layout_width="0dp" android:layout_height="wrap_content" /> <Button android:text="Browse" android:onClick="showWebsite" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <WebView android:layout_weight="1" android:id="@+id/myWebView" android:layout_width="match_parent" android:layout_height="0dp" ></WebView> </LinearLayout>
Month: May 2018
Handlerの使い方
new Handler().postDelayed(<Runnable object>,<m seconds>); private final Runnable func= new Runnable(){ @Override public void run(){ } };
private Handler mHandler = new Handler(); private Runnable updateText; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); updateText = new Runnable(){ public void run(){ TextView text = (TextView) findViewById(R.id.count); Integer count = Integer.valueOf(text.getText().toString()); count += 1; text.setText(count.toString()); mHandler.removeCallbacks(updateText); mHandler.postDelayed(updateText, 1000); } }; mHandler.postDelayed(updateText, 1000); }
SimpleDateFormat
SimpleDateFormat は、日付のフォーマットと解析を、ロケールを考慮して行うための具象クラスです。これによって、フォーマット (日付 -> テキスト)、解析 (テキスト -> 日付)、および正規化を行うことができます。
SimpledateFormat()
デフォルトのロケール、パターン、日付フォーマット記号を持つ、オブジェクトを生成
SimpledateFormat(String)
指定されたパターン、デフォルトのロケール、日付フォーマット記号を持つ、オブジェクトを生成
SimpledateFormat(String, DateFormatSymbols)
指定されたパターン、日付フォーマット記号を持つ、オブジェクトを生成します。
SimpledateFormat(String, Locale)
指定されたパターン、ロケール、デフォルトの日付フォーマット記号を持つ、オブジェクトを生成
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
sdfって何かと思ったら、simple date formatの略でしょうね。
import java.util.*; import java.text.*; class Playground { public static void main(String[ ] args) { Date date1 = new Date(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'/'MM'/'dd'?'"); System.out.println(sdf1.format(date1)); sdf1.applyPattern("yyyy/MM/dd"); System.out.println(sdf1.format(date1)); } }
なるほど、その名の通り、dateformatですね。
runnble 2
class Playground { public static void main(String[ ] args) { SubThread sub = new SubThread(); Thread thread = new Thread(sub) thread.start(); } } class SubSthread implement Runnable{ public void run(){ } }
うまく動きません。。
class Playground {
public static void main(String[ ] args) {
SubThread sub = new SubThread();
Thread thread = new Thread(sub);
thread.start();
for(int i = 0; i < 10; i++){
System.out.println("Lets go cletic");
try{
Thread.sleep(300);
} catch(InterruptedException e){
}
}
}
}
class SubThread implements Runnable{
public void run(){
for(int i = 0; i < 10; i++){
System.out.println("cleveland");
try {
Thread.sleep(500);
} catch(InterruptedException e){
}
}
}
}
[/java]
500msごとに、他のclassで実行しています。
Lets go cletic
cleveland
Lets go cletic
cleveland
Lets go cletic
Lets go cletic
cleveland
Lets go cletic
cleveland
Lets go cletic
Lets go cletic
cleveland
Lets go cletic
Lets go cletic
cleveland
Lets go cletic
cleveland
cleveland
cleveland
cleveland
>Javaのクラスは1つのクラスの子クラスにしかなれない制約がある
これに関係していることか?
う~ん、これだと駄目ですね。。
class RacingCar implements Runnable {
private int number = 0;
private static int round = 5;
private static String[] printOffset = {“”, “\t\t\t”,”\t\t\t\t\t\t”};
public RacingCar(int number){
this.number = number;
}
public void run(){
for(int i = 1; i <= round; i++){
try {
Thread.sleep((long)(Math.random()* 1000));
} catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(printOffset[number-1] + this.number+"号車"+i+"周目通過");
}
System.out.println(printOffset[number-1]+ this.number + "号車GOAL!!");
}
}
[/java]
プログラムの実行状態をスレッドといい、全てのプログラムはスレッドによって実行される。javaコマンドが実行されると、JVMは新しいスレッドを作成し、そのスレッドによって指定したクラスのmainメソッドが実行される。mainメソッドの実行が終了するとスレッドは消滅する。
runnable()
run();
オブジェクトが実装するインタフェース Runnable を使ってスレッドを作成し、そのスレッドを開始すると、独立して実行されるスレッド内で、オブジェクトの run メソッドが呼び出される。
class Playground {
private static class Thread {
@Override
public void run(){
for (int i = 0; i < 20; i++){
System.out.println(i + ":" + this.hashCode());
}
}
}
public static void main(String[ ] args) {
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.start();
t2.start();
}
}
[/java]
stop watch
public class MainActivity extends AppCompatActivity { private long startTime; private long elapsedTime = 0l; private Handler handler = new Handler(); private Runnable updateTimer; private Button startButton; private Button stopButton; private Button resetButton; private TextView timerLabel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startButton = (Button) findViewById(R.id.startButton); stopButton = (Button) findViewById(R.id.stopButton); resetButton = (Button) findViewById(R.id.resetButton); timerLabel = (TextView) findViewById(R.id.timerLabel); setButtonState(true,false,false); } public void setButtonState(boolean start, boolean stop, boolean reset){ startButton.setEnabled(true); stopButton.setEnabled(false); resetButton.setEnabled(false); } public void startTimer(View view){ // startTimeの取得 startTime = SystemClock.elapsedRealtime(); // 起動してからの経過時間(ミリ秒) // 一定時間ごとに現在の経過時間を表示 // handler -> Runnable(処理) -> UI updateTimer = new Runnable(){ @Override public void run(){ long t = SystemClock.elapsedRealtime() - startTime + elapsedTime; SimpleDateFormat sdf = new SimpleDateFormat("mm:ss.SSS", Locale.US); timerLabel.setText(sdf.format(t)); handler.removeCallbacks(updateTimer); handler.postDelayed(updateTimer, 10); } }; handler.postDelayed(updateTimer, 10); // ボタンの操作 setButtonState(false, true, false); } public void stopTimer(View view){ elapsedTime += SystemClock.elapsedRealtime() - startTime; handler.removeCallbacks(updateTimer); setButtonState(true,false, true); } public void resetTimer(View view){ elapsedTime = 0; timerLabel.setText("00:00.000"); setButtonState(true,false, false); } }
runnable、SimpleDateFormat、removeCallbacks、handlerがよくわからんな。
SystemClock.elapsedRealtime();
SystemClock.elapsedRealtime();はdeveloperの公式ページに掲載されています。
https://developer.android.com/reference/android/os/SystemClock
elapsedRealtime() and elapsedRealtimeNanos() return the time since the system was booted, and include deep sleep. This clock is guaranteed to be monotonic, and continues to tick even when the CPU is in power saving modes, so is the recommend basis for general purpose interval timing.
public void startTimer(View view){ // startTimeの取得 startTime = SystemClock.elapsedRealtime(); // 起動してからの経過時間(ミリ秒) // 一定時間ごとに現在の経過時間を表示 // handler -> Runnable(処理) -> UI updateTimer = new Runnable(){ @Override public void run(){ long t = SystemClock.elapsedRealtime() - startTime; SimpleDateFormat sdf = new SimpleDateFormat("mm:ss.SSS", Locale.US); timerLabel.setText(sdf.format(t)); handler.removeCallbacks(updateTimer); handler.postDelayed(updateTimer, 10); } }; handler.postDelayed(updateTimer, 10); // ボタンの操作 setButtonState(false, true, false); }
setEabled(true)とsetEnabled(false)
setEnabledでtrueだとbuttonを押せる。
private Button startButton; private Button stopButton; private Button resetButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startButton = (Button) findViewById(R.id.startButton); stopButton = (Button) findViewById(R.id.stopButton); resetButton = (Button) findViewById(R.id.resetButton); setButtonState(true,false,false); } public void setButtonState(boolean start, boolean stop, boolean reset){ startButton.setEnabled(true); stopButton.setEnabled(false); resetButton.setEnabled(false); }
android studioでbuildされたapkファイルの場所
AndroidStudioProjects -> AppName -> app -> build -> outputs -> apk -> dubug に
app-debug.apkがつくられている
firstname, lastname, phone, emailをintentする
public void getScore(View view){ // edittextを取得 EditText fEditText = (EditText) findViewById(R.id.firstnEditText); EditText lEditText = (EditText) findViewById(R.id.lastnEditText); EditText pEditText = (EditText) findViewById(R.id.phoneEditText); EditText mEditText = (EditText) findViewById(R.id.mailEditText); // edittextの中身を取得 String firstName = fEditText.getText().toString().trim(); String lastName = lEditText.getText().toString().trim(); String myPhone = pEditText.getText().toString().trim(); String myMail = mEditText.getText().toString().trim(); Pattern p = Pattern.compile("^[0-9\\-]+"); Matcher m = p.matcher(myPhone); Pattern mp = Pattern.compile("^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$"); Matcher mm = mp.matcher(myMail); // 中身を観て条件分岐 if (firstName.equals("")){ fEditText.setError("Please enter your first name!"); } else if(lastName.equals("")){ lEditText.setError("Please enter your last name!"); } else if(myPhone.equals("") || m.find() == false){ pEditText.setError("Please enter your phone number!"); }else if(myMail.equals("") || mm.find() == false){ mEditText.setError("Please enter your valid email"); } else { Intent intent = new Intent(this, MyResult.class); intent.putExtra(EXTRA_MYFNAME, firstName); intent.putExtra(EXTRA_MYLNAME, lastName); intent.putExtra(EXTRA_MYPHONE, myPhone); intent.putExtra(EXTRA_MYMAIL, myMail); startActivity(intent); } }
入力すると
引き継がれる! EditTextは良さそうですね。