Android ~Activity を Fragment にする~
こんにちは。新しい方のあらいではなく、荒れてる方のあらいです。
今日は、歩数計アプリの、Main となるActivity を Fragment に直してみました。
いくつかエラーが出たので、1つ1つどのように直したのか、書こうと思います。
まずは、直す前のActivity
public class WalkMeterActivity extends Activity implements OnClickListener { private TextView mSensorTextView; private TextView mSensorTextView2; private Button mStartButton; private Button mStopButton; WalkMeterSQLiteOpenHelper db; private class WalkMeterReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == WalkMeterService.ACTION) { screenDisplay(); } } } private WalkMeterService mWalkMeterService; private final WalkMeterReceiver mWalkMeterReceiver = new WalkMeterReceiver(); private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { mWalkMeterService = ((WalkMeterService.WalkMeterBinder)service).getService(); startDisplay(); } @Override public void onServiceDisconnected(ComponentName className) { mWalkMeterService = null; } }; //Preferenceの値 private SharedPreferences preference; private Editor editor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSensorTextView = (TextView)findViewById(R.id.text_sensor); mSensorTextView2 = (TextView)findViewById(R.id.text_sensor_distance); mStartButton = (Button)findViewById(R.id.button_start); mStopButton = (Button)findViewById(R.id.button_stop); mStartButton.setOnClickListener(this); mStopButton.setOnClickListener(this); db = new WalkMeterSQLiteOpenHelper(this); //プリファレンスの準備 preference = getSharedPreferences("name_and_height", MODE_PRIVATE); editor = preference.edit(); //初回起動だけの処理 if(preference.getBoolean("Launched", false)==false){ Intent intent = new Intent(); intent.setClassName("com.notnewarai.walkmeter","com.notnewarai.walkmeter.FirstSetting"); startActivity(intent); //Launchedの書き換え(2回目以降は、設定しなくてもいいように) editor.putBoolean("Launched", true); editor.commit(); } } @Override public void onResume() { startService(new Intent(this, WalkMeterService.class)); registerReceiver(mWalkMeterReceiver, new IntentFilter(WalkMeterService.ACTION)); bindService(new Intent(this, WalkMeterService.class), mServiceConnection, Context.BIND_AUTO_CREATE); super.onResume(); } public void startDisplay() { if (mWalkMeterService.getState()) { screenDisplay(); } } public void screenDisplay() { mSensorTextView.setText(mWalkMeterService.getCounter() + getString(R.string.label_counter)); mSensorTextView2.setText(calcDistance(mWalkMeterService.getCounter()) + getString(R.string.label_counter2)); /* getHistoryStepsがうまくいかないので、コメントアウト if(calcDistance(mWalkMeterService.getCounter()+db.getAllHistorySteps()) >= 2400 ){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("ゴール!!") .setMessage("おめでとうー。") .show(); } */ } @Override public void onDestroy() { super.onDestroy(); db.close(); unbindService(mServiceConnection); unregisterReceiver(mWalkMeterReceiver); if (!mWalkMeterService.getState()) mWalkMeterService.stopSelf(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_start: if (mWalkMeterService.getState()) return; mWalkMeterService.startCount(); break; case R.id.button_stop: if (!mWalkMeterService.getState()) return; mWalkMeterService.stopCount(); break; } } public double calcDistance(int counter){ double km_distance = counter * getHeight(this) * 0.45 / 100000; BigDecimal bd_km_distance = new BigDecimal(km_distance); BigDecimal down_bd_km_distance = bd_km_distance.setScale(1, BigDecimal.ROUND_DOWN); double distance = down_bd_km_distance.doubleValue(); return distance; } public int getHeight(Context context){ SharedPreferences pref = context.getSharedPreferences( "name_and_height", Context.MODE_PRIVATE ); String strHeight = pref.getString("user_height", "-1"); return Integer.parseInt(strHeight); } }
エラー
- setContentView(R.layout.main);
- findViewByIdの箇所
- db = new WalkMeterSQLiteOpenHelper(this); のような、this など Contextを使っている箇所
- Preference
- startService(new Intent(this, WalkMeterService.class)); のような、サービスに関係する箇所
先に、直し終えたFragmentのコードです。
public class WalkMeterFragment extends Fragment implements OnClickListener { private TextView mSensorTextView; private TextView mSensorTextView2; private Button mStartButton; private Button mStopButton; WalkMeterSQLiteOpenHelper db; private class WalkMeterReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == WalkMeterService.ACTION) { screenDisplay(); } } } private WalkMeterService mWalkMeterService; private final WalkMeterReceiver mWalkMeterReceiver = new WalkMeterReceiver(); private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { mWalkMeterService = ((WalkMeterService.WalkMeterBinder)service).getService(); startDisplay(); } @Override public void onServiceDisconnected(ComponentName className) { mWalkMeterService = null; } }; //Preferenceの値 private SharedPreferences preference; private Editor editor; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.walkmeterfragment, container, false); mSensorTextView = (TextView)view.findViewById(R.id.text_sensor); mSensorTextView2 = (TextView)view.findViewById(R.id.text_sensor_distance); mStartButton = (Button)view.findViewById(R.id.button_start); mStopButton = (Button)view.findViewById(R.id.button_stop); mStartButton.setOnClickListener(this); mStopButton.setOnClickListener(this); return view; } @Override public void onAttach(Activity act){ super.onAttach(act); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db = new WalkMeterSQLiteOpenHelper((MainActivity)getActivity()); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onResume() { getActivity().startService(new Intent(getActivity(), WalkMeterService.class)); getActivity().registerReceiver(mWalkMeterReceiver, new IntentFilter(WalkMeterService.ACTION)); getActivity().bindService(new Intent(getActivity(), WalkMeterService.class), mServiceConnection, Context.BIND_AUTO_CREATE); super.onResume(); } public void startDisplay() { if (mWalkMeterService.getState()) { screenDisplay(); } } public void screenDisplay() { mSensorTextView.setText(mWalkMeterService.getCounter() + getString(R.string.label_counter)); mSensorTextView2.setText(calcDistance(mWalkMeterService.getCounter()) + getString(R.string.label_counter2)); } @Override public void onDestroy() { super.onDestroy(); db.close(); getActivity().unbindService(mServiceConnection); getActivity().unregisterReceiver(mWalkMeterReceiver); if (!mWalkMeterService.getState()) mWalkMeterService.stopSelf(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_start: if (mWalkMeterService.getState()) return; mWalkMeterService.startCount(); break; case R.id.button_stop: if (!mWalkMeterService.getState()) return; mWalkMeterService.stopCount(); break; } } public double calcDistance(int counter){ double km_distance = counter * getHeight((MainActivity)getActivity()) * 0.45 / 100000; BigDecimal bd_km_distance = new BigDecimal(km_distance); BigDecimal down_bd_km_distance = bd_km_distance.setScale(1, BigDecimal.ROUND_DOWN); double distance = down_bd_km_distance.doubleValue(); return distance; } public int getHeight(Context context){ SharedPreferences pref = context.getSharedPreferences( "name_and_height", Context.MODE_PRIVATE ); String strHeight = pref.getString("user_height", "-1"); return Integer.parseInt(strHeight); } }
どのように変更したか
- setContentView → onCreateViewメソッドを作成
- findViewById → view.findViewById にする
- db = new WalkMeterSQLiteOpenHelper(this); のthis → getActivity() にする
- Preference → Fragmentから消し去り、Tabを管理する MainActivity の onCreate に移す
- startService(new Intent(this, WalkMeterService.class)); → getActivity().startService ・・・ のように先頭にgetActivity()をつける
以上、AcitivityをFragment に直す際に出たエラーと、解決策でした!
ありがとうございました。また今度!
(最近、運動にハマってきました・・・。目指せ逆三角形!ww)