2012-04-16 14 views
1

私は、ユーザーがギャラリーをブラウズし、選択したイメージを選択し、その選択を変更せずにギャラリーをブラウズできるギャラリーがあります。これは、onItemSelectedを使用して、選択している(つまり、クリックした)画像が既に選択されている画像(ギャラリーの動きによって)であるかどうかを確認することによって機能します。したがって:ギャラリーがオリエンテーション変更後にonItemSelectedを呼び出す

  1. ユーザーはギャラリーを前後に移動します。
  2. ユーザーは好みの画像を決め、ギャラリーをその中心に配置します。
  3. ユーザーが画像をクリックすると、「選択済み」になり、緑色の枠線が表示されます。
  4. ユーザーは、現在中心の画像が自動的に「選択」されることなく、ギャラリー内を前後に移動し続けることができます。

これは問題ありません。しかし、私は今、画像を選択しているときにオリエンテーションの変更を許可しようとしていますが、私が見つけたことは、onConfigChangedコードがすべて実行された後にonItemSelectedがギャラリーで呼び出されることです。

だからonConfigChangeパラメータ(つまり、向きを変更する前にギャラリーがあったインデックス)を設定してから、私はinitialiseUIメソッドを呼び出します。これは、正常に実行され、オリエンテーションが変更される前に配置された同じインデックスにギャラリーを配置することを含め、必要なものすべてを設定します。しかし、中央の画像ではonItemSelectedが呼び出されます。これにより、中央の画像がユーザーの選択なしに選択されます(緑の枠線など)。

configIsChangingがfalseの場合にのみ、ブールフラグ "configIsChanging"を使用してonItemSelectedコードを実行しようとしました。残念ながら、onConfigChangeが完了した後にonItemSelectedが呼び出され、その時点でフラグがfalseにリセットされているため、これはうまくいかないようです。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    configChanging = true; 

    tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

    super.onConfigurationChanged(newConfig); 

    setContentView(R.layout.take_questionnaire); 

    initialiseUI(); 
    configChanging = false; 
} 

は、誰もが不正onItemSelectedイベントの経験がありましたか?何か案は?必要に応じてさらにコードを投稿することができます。助けてくれてありがとうございました。

答えて

0

@ Gabrielの回答から、次のコードスニペットを使用して問題を解決しました。それはガブリエルのコードとは少し違う、と私は誰もはい、私はそれをやったが、私の活動は、上記のコードは説明するよりも、より複雑である程度:)

@Override 
protected void onResume() { 
    super.onResume();  
    configChanging = true; 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
if (mAdapter.selectedIndex > -1) { 
    tempConfigSelectedIndex = mAdapter.selectedIndex; 
} 

super.onConfigurationChanged(newConfig); 
if (configChanging) { 
    tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

    setContentView(R.layout.take_questionnaire); 

    initialiseUI(); 
} 
} 

@Override 
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 

if (!configChanging){ 
    // code here to execute only when user clicks 
} 
configChanging = false; 
// code here to execute when either user clicks OR config is changed 
} 
3

マニフェストにアンドロイド:configChanges = "orientation"を入れてみましたか?

+0

を気にしないだろうビットを残してきました。それは潜在的な回答として一連の画像をそれぞれ有する多数の「質問」を反復し、ユーザは各質問に対して1つを選択しなければならない。私のコードで構成の変更を処理しない限り、向きの変更によってユーザーは最初の質問に戻ります。 – breadbin

+0

問題の原因を理解していますが、デバッグに役立ちます。http://developer.android.com/guide/topics/manifest/activity-element.html#config and http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android。onRetainNonConfigurationStateにonSavedInstanceStateを使用することです。 – josephus

+0

私は一見ありがとうございます。 – breadbin

1

あなたのブール値(おそらくフィールド)をあなたのonResume/onCreateに入れることができませんか?

configIsChanging = true;あなたの2つのメソッドonPauseとonResumeでは、

@Override  
public void onConfigurationChanged(Configuration newConfig) 
{ 
    if(!configIsChanging){ 
     tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

     super.onConfigurationChanged(newConfig); 

     setContentView(R.layout.take_questionnaire); 

     initialiseUI(); 
    }else{ 
     configIsChanging = false; 
    } 
} 

これは私に役立ちます。

+0

それは助ける!今度は最初の設定変更のために働きますが、その後の設定変更については前と同じ問題があります。上で、あなたは "onResume/onCreate"と言い、次の行 "onPause and onResume"には - onCreate、onPause、またはその両方を意味しましたか? – breadbin

+0

さて、私はそれを働かせました。いくつかのことを変えなければならなかった。私は<100の評判を持っているので、Stackは私が自分の質問に5時間も答えないようにしますが、明日はそれを望む人のために解決策を出すでしょう。 – breadbin

+0

ええ、私は混乱しました。それは、黙っていました。 でも良いことはあなたのために働いた]] 答えを投稿できるようになるまで、答えを使って質問を編集する必要があります。 –

関連する問題