ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのEclipseでのAndroidアプリ開発について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初歩の初歩ですみません。


明示的インテントを使った複数画面の遷移のためのjavaとManifestを教えてください涙

2画面の画面遷移は可能なのですが、
複数画面の遷移だと同じようにしても移動してくれませんあせあせ(飛び散る汗)
2画面の場合と異なるのでしょうか?
今は

package com.syboos.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MyAndroidActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Log.d("MyInfo", "Test output");

//副画面に遷移 ボタン
Button btnGotoSub = (Button)findViewById(R.id.btnGotoSub);
//ボタンのクリックイベントリスナー を設定
btnGotoSub.setOnClickListener(this);
}

/*
* ボタンクリック処理
*/
public void onClick(View v) {
Log.d("MyInfo", v.getId() + v.toString());
Button b = (Button)v;
Log.d("MyInfo", "Button");

try {
if (b.getId() == R.id.btnGotoSub) {
//id は R.id.btnGotoSub(副画面に遷移ボタン)である

//Intent インスタンス生成
Intent intent = new Intent(MyAndroidActivity.this, MySubActivity.class);
//副画面を起動
startActivity(intent);
Log.i("MyInfo", "Start activity ok");
}
} catch (Exception e) {
Log.d("MyInfo", "Error", e);
}
}
}



こんな感じにやってます。
お力お貸しください。

コメント(20)

携帯からだから大したアドバイスできないけど。
マニフェストも遷移先も、2つ用意したらできるんじゃないかな。ウェブにも多分沢山情報あるよ。
ダイさんありがとうございます。
ウェブでも結構探したんですけど
いまいちわからなくてあせあせ(飛び散る汗)
どちらも2つ用意したんですけど
飛ばないんですよねあせあせ(飛び散る汗)
おはようございます。
投稿されたソースでは、ボタン押すとマイサブアクティビティを起動するんですよね?
※アンドロイド久しくやってないので間違ってたらすみませんあせあせ(飛び散る汗)

それなら、起動するアクティビティを別のやつに変えたら別の画面が起動するんじゃないか?

主画面に入力された条件から遷移先かえてもいいし、ボタン複数作って、マニフェストにオンクリック属性書けば、ボタン毎にメソッド書けるはず。id属性でどのボタンが押されたか判断することもできると思いますので、idでイフ文の分岐から遷移先を決めてもいいと思いますよ。

あと、この投稿を読んだ有識者方、間違いあったら指摘してください顔(願)
ありがとうございます。
mainにstart activityがあって、subにfinish();を使ってるんですが
sub1にとんだあと、そのsub1からまた、違うページ(sub2)に飛ばしたいです。
この場合finish();のあとにmainで使ったstart activityと同じ要領で
ボタンのidを変えてjavaに書き込んだんじゃだめなんですが、これはsub1の
javaが間違ってるんでしょうか?エラーは出てないんですが…
それとも、manifestがだめなんでしょうか?


長くなって申し訳ないのですが、manifestの </activity>の部分だけ加えたのじゃだめなんですか?

ホント無知ですみません。お願いします。
もう解決しているかも?

パソコンで見てないからなんとも言えないんだけど、

インテントオブジェクトを生成するときに、遷移先のアクティビティ指定しますよね?
そしてそのインテントをスタートさせると、そのアクティビティが起動する。

なので、サブ1からサブ2へ行きたいときは、サブ1側のマニフェストなりなんなりにサブ2への工夫がいるのではないでしょうか。

追記
久々にアンドロイド考えてたからなんか間違っていたみたいです。

とりあえず、追加でス。
画面を作るってことは、アクティビティを作成する+レイアウト.xmlで画面レイアウトを作成するってことだと認識しています。そのため、Main画面とSub1画面を作るということは、それぞれのActivityとレイアウト.xmlが必要になります。※別にレイアウトはxmlでなくてもできたと思いますが、xmlのほうが視覚的にわかりやすいかと。

Intent intent = new Intent(MainActivty.this, SubActivity.class);みたいのは、次に動かすアクティビティはSub1だゾっていうことを定義している事になるはず。
ここまではできているんですよね。
ではこの先、Sub1が表示されたらどうするかというと、Sub1を主画面に見立てて、遷移先をSub2に置き換えてあげれば基本的には同じ書き方ができるはずです。

Sub1Activityで、多分、
Intent intent = new Intent(Sub1Activty.this, Sub2Activity.class);みたいになるんじゃないですかね。
もちろん、この時のレイアウトはsub1_layout.xmlとかになるはずです。


いかがでしょうか。

※マニュフェストファイルに作成したアクティビティを追加するのを忘れずに。
おはようございます晴れ

それってsub2のjavaはfinish();を書き終えてから
sub1と同様にするって感じですよね?
そこまでは考えてやってみたんですけど
sub1のどこからどこまでをsub2に入れちゃえばいいんですかね?あせあせ(飛び散る汗)
Called when the activity のつぎの
public voidから書き換えたんですけどできなくて…


あとマニフェストにはsub1のactivityのあとに
sub2のインテントとactivityの追加をすればいいんですか?あせあせ(飛び散る汗)

どんどんすいませんあせあせ(飛び散る汗)
おはようございます。

サブ1とサブ2のアクティビティはクラスは別に作ったほうがいいかと。当然アクティビティクラスを継承します。

まずはメインアクティビティからサブ1を起動しますよね。このときはサブ1のスタートが動いてると思います。
もちろんサブ1.xmlでレイアウトはかかれますよね。

で、サブ1のレイアウトにボタン作って、サブ2のアクティビティクラス内でボタンクリックのイベント取ればできませんか?

サブ1、2のアクティビティクラスもレイアウトXMLも、それぞれ別ファイルで作ればそれほど難しくはないと思うんですが。
メインからサブ1まではできてるみたいですしあせあせ(飛び散る汗)
そもそも
main -> sub1 -> sub2
という画面遷移をしたいのに、なんでsub2に遷移する前にsub1をfinish()してるの?

普通はfinishメソッドをそのタイミングでは呼び出さないし、sub2から直接mainに戻りたいなら、sub1でstartActivityForResultして、onActivityResultの呼び出し時にsub1をfinish()すべきでは?

とりあえず、sub1 / sub2の実装も書き込んだほうが良いと思います。
ご協力ありがとうございます。
何せ本当無知なので助かります涙電球
main画面java↓


package top.face;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Face extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.face);

Log.d("MyInfo", "Test output");

Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(this);
}

public void onClick(View v) {
Log.d("MyInfo", v.getId() + v.toString());
Button b = (Button)v;
Log.d("MyInfo", "Button");

try {
if (b.getId() == R.id.button2) {

Intent intent = new Intent(Face.this, Ques.class);
startActivity(intent);
Log.i("MyInfo", "Start activity ok");
}
} catch (Exception e) {
Log.d("MyInfo", "Error", e);
}
}
}
sub1のjava画面


package top.face;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class Ques extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("MyInfo", "Ques");
super.onCreate(savedInstanceState);
setContentView(R.layout.ques);

Log.i("MyInfo", "Ques2");

Button button3 = (Button)findViewById(R.id.button3);
button3.setOnClickListener(this);

Log.i("MyInfo", "Ques3");
}


public void onClick(View v) {
Button b = (Button)v;
if (b.getId() == R.id.button3) {


}
}




public void onCreate1(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ques);

Log.d("MyInfo", "Test output");

Button btnGotoSub = (Button)findViewById(R.id.button1);
btnGotoSub.setOnClickListener(this);
}

@SuppressWarnings("unused")
public void onClick1(View v) {
Log.d("MyInfo", v.getId() + v.toString());
Button b = (Button)v;
Log.d("MyInfo", "Button");

try {
if (b.getId() == R.id.button1) {

Intent intent = new Intent(Ques.this, Year.class);

Log.i("MyInfo", "Start activity ok");
}
} catch (Exception e) {
Log.d("MyInfo", "Error", e);
}
}
}
sub2の画面


package top.face;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class Year extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("MyInfo", "Year");
super.onCreate(savedInstanceState);
setContentView(R.layout.year);

Log.i("MyInfo", "Year2");

Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);

Log.i("MyInfo", "Year3");
}


public void onClick1(View v) {
Button b = (Button)v;
if (b.getId() == R.id.button1) {
this.finish();

}
}


public void onClick(View arg0) {
// TODO Auto-generated method stub

}}



マニュフェスト


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="top.face"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="4" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".Face"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="Ques"
android:label="@string/app_name" >


<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />



<category android:name="android.intent.category.OPENABLE"/>
</intent-filter>




</activity>
<activity android:name="Year"
android:label="@string/app_name" >


<intent-filter>
<action android:name="android.intent.action.MAIN" />





<category android:name="android.intent.category.OPENABLE"/>
</intent-filter>
</activity>
<activity

</intent-filter>
</activity>

</application>

</manifest>
上記4枚書き込んだんですが
mainからsub1までは行きますが今度は
mainに戻らなくsub2にも飛びません涙
どこにもエラー出てないんですが、
何がだめか教えて下さい。
sub1(class Ques)で、ボタン押された時のイベント何もしてない。
そもそも、sub1からsub2を呼び出すコードが書いてないので、当然sub2は呼び出されない。

↓ここね

public void onClick(View v) {
Button b = (Button)v;
if (b.getId() == R.id.button3) {


}
}

================================================

sub1からmainに戻りたいなら、どこかのタイミングでQues#finishを呼び出すか、sub1が表示されている状態で、物理戻るボタンを押しましょう。
おはようございます。


やってみたんですが
サブ1からサブ2を呼び出すコードが
わけらなくてがまん顔あせあせ(飛び散る汗)


なんどもすみませんバッド(下向き矢印)
『やってみた』ってのは何をどう試してみたの?
そもそも、わからなくて、↓のコードどうやって書いたの?


if (b.getId() == R.id.button2) {

Intent intent = new Intent(Face.this, Ques.class);
startActivity(intent);
Log.i("MyInfo", "Start activity ok");
}
Androidのプログラミングの本で<明示的なインテントの生成と、画面を遷移>を読みながら見よう見まねで書きました。
やってみたのは

public void onClick(View v) {
switch (v.getId()) {
case R.id.button3:
Intent i = new Intent (this, Face.class);
startActivity(i);

を付け足して書いてみました。
Intentクラスのコンストラクタの第二引数は、呼び出し先classのClassオブジェクトを渡します。
なので、Face.classじゃなくてYear.classじゃないとダメです。

あとは、ボタン押した時にonClieckメソッドがちゃんと呼ばれてるかとか、startActivityメソッドの呼び出しのところまで処理が進んでいるかとか、printfデバッグでもいいから一度確かめると、問題の切り分けにいいかと。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング