FragmentのonPauseとonStopが二回繰り返される事象について

2,316 views
Skip to first unread message

Sho Kohara

unread,
Feb 29, 2012, 8:19:17 AM2/29/12
to android-g...@googlegroups.com
いつもお世話になっております。小原です。
Fragmentを継承したクラスでonPause時にIntegerの数値をSharedPreferencesに保存したいのですが、onPauseが2回実行されているようです。
02-29 22:03:48.810: D/PowerFragment(10673): onPause
02-29 22:03:48.810: D/PowerFragment(10673): 3005
02-29 22:03:48.833: D/PowerFragment(10673): onPause
02-29 22:03:48.833: D/PowerFragment(10673): 3000
02-29 22:03:48.982: D/OpenGLRenderer(10673): Flushing caches (mode 0)
02-29 22:03:50.224: D/PowerFragment(10673): onStop
02-29 22:03:50.232: D/PowerFragment(10673): onStop
02-29 22:03:50.248: D/OpenGLRenderer(10673): Flushing caches (mode 1)
これはなぜでしょうか?
どんな小さな情報でもいいので教えて下さい・・・。

awwa

unread,
Feb 29, 2012, 10:17:34 PM2/29/12
to android-g...@googlegroups.com
あわと申します。

最も最小構成のプロジェクトを作成して、
この現象が再現するか確認してみましたか?
再現しなければそこから問題のあるプロジェクトとの
差分を探していくのが良いかと思います。

なんとなくですがFragmentのインスタンスが2つあるんじゃないかと思いますが、
これだけの情報ではわかりません。

ではでは。

2012年2月29日22:19 Sho Kohara <ion...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/PlwgukhfDWIJ
> にアクセスしてください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。

--
awwa <aww...@gmail.com>
Twitter http://twitter.com/awwa500
Blog http://awwa500.blogspot.com/

Sho Kohara

unread,
Feb 29, 2012, 10:45:25 PM2/29/12
to android-g...@googlegroups.com
あわさんご返信ありがとうございます。
私の知識の範囲で可能な限り最小構成のFragmentプロジェクトを作成してみましたが、やはりonResumeやonStart等が二回呼ばれている様です。
その時のログとソースコードを貼りますのでご教授願えませんでしょうか。
MainなActivity
package jp.gr.java_conf.ionexux.fragmenttest;

import android.app.Activity;
import android.app.FragmentTransaction;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;

public class FragmentTestActivity extends Activity {


private FragmentTest2 mFragmentTest2;
private String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);

}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");

// PowerFragmentをインスタンス化する
mFragmentTest2 = new FragmentTest2();
// fragmentのマネージャを取得する
FragmentTransaction ft = getFragmentManager().beginTransaction();

//  fragmentを配置する
ft.add(R.id.powerFragment, mFragmentTest2);

// トランザクションをコミットする
ft.commit();

}
}


MainのActivityに利用されるFragment
package jp.gr.java_conf.ionexux.fragmenttest;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentTest2 extends Fragment {

private final String TAG = "FragmentTest2";

@Override
public void onAttach(Activity act) {
super.onAttach(act);
Log.d(TAG, "onAttach");
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");

// レイアウトを生成
View v = inflater.inflate(R.layout.power, container, false);

return v;
}

@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
Log.d(TAG, "onActivityCreated");
}

@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}

@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");

}

@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause");

}

@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}

@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
}

@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}

@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach");
}
}


MainなActivityに利用されるレイアウトxml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/powerFragment"
        android:name="jp.gr.java_conf.ionexux.fragmenttest.FragmentTest2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>

Fragmentに利用されるレイアウトxml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/powerTextView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/powerDownButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/down" />

        <Button
            android:id="@+id/powerUpButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/up" />
    </LinearLayout>

    <Button
        android:id="@+id/powerStopButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/stop" />

    <Button
        android:id="@+id/powerStartButton"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/start" />

</LinearLayout>

何卒よろしくお願いします


2012年3月1日木曜日12時17分34秒 UTC+9 awwa:

> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com


> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。

Sho Kohara

unread,
Feb 29, 2012, 10:47:46 PM2/29/12
to android-g...@googlegroups.com
その時のログを貼り忘れました、すみません。
以下になります
03-01 12:38:53.316: D/MainActivity(22063): onCreate
03-01 12:38:53.348: D/FragmentTest2(22063): onAttach
03-01 12:38:53.348: D/FragmentTest2(22063): onCreate
03-01 12:38:53.348: D/FragmentTest2(22063): onCreateView
03-01 12:38:53.348: D/FragmentTest2(22063): onActivityCreated
03-01 12:38:53.348: D/FragmentTest2(22063): onStart
03-01 12:38:53.348: D/MainActivity(22063): onResume
03-01 12:38:53.348: D/FragmentTest2(22063): onResume
03-01 12:38:53.348: D/FragmentTest2(22063): onAttach
03-01 12:38:53.348: D/FragmentTest2(22063): onCreate
03-01 12:38:53.348: D/FragmentTest2(22063): onCreateView
03-01 12:38:53.355: D/FragmentTest2(22063): onActivityCreated
03-01 12:38:53.355: D/FragmentTest2(22063): onStart
03-01 12:38:53.355: D/FragmentTest2(22063): onResume
03-01 12:38:53.426: D/libEGL(22063): loaded /system/lib/egl/libGLES_android.so
03-01 12:38:53.457: D/libEGL(22063): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-01 12:38:53.496: D/libEGL(22063): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-01 12:38:53.512: D/libEGL(22063): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-01 12:38:53.629: D/OpenGLRenderer(22063): Enabling debug mode 0
以上です。

2012年3月1日木曜日12時45分25秒 UTC+9 Sho Kohara:

yamada

unread,
Feb 29, 2012, 11:29:43 PM2/29/12
to android-g...@googlegroups.com
山田です。

多分これがいらない。

// // PowerFragmentをインスタンス化する
// mFragmentTest2 = new FragmentTest2();
// // fragmentのマネージャを取得する
// FragmentTransaction ft = getFragmentManager().beginTransaction();
// 
// //  fragmentを配置する
// ft.add(R.id.powerFragment, mFragmentTest2);
// 
// // トランザクションをコミットする
// ft.commit();

fragemntはlayoutのxmlで記述されているので、
setContentView()でインスタンス化されます。

(ボタンを押したときなど)動的にfragmentを切り替えるときは、
FragmentManagerを取得して変更するけどlayoutのxmlをそのまま使うだけなら
new はいらないと思います。

Sho Kohara

unread,
Mar 1, 2012, 12:28:52 AM3/1/12
to android-g...@googlegroups.com
山田さん、ご返信ありがとうございます。
ご指摘通り修正しましたところお陰様で解決に至りました。
ご指南ありがとうございました。

2012年3月1日木曜日13時29分43秒 UTC+9 yamada:
Reply all
Reply to author
Forward
0 new messages