2017-08-30 32 views
0

在我的應用程序中,我有一個顯示某個級別的列表視圖。如何防止我的活動再次啓動?

我用資產中的文件填充listview。 我的資產文件是這樣的:

<question> 
    <image>pic1.png</image> 
    <option1>one.png</option1> 
    <option2>two.png</option2> 
    <option3>three.png</option3> 
    <option4>four.png</option4> 
    <answer>1</answer> 
    <level>1</level> 
</question> 

我的列表視圖中顯示的水平,當我點擊列表視圖的項目轉到另一個活動,到下一個活動顯示了我的問題,我的選擇也是如此。 每一件事情都可以,我的問題是當第二次活動中的按鈕按下第一次活動時,第一次活動再次啓動,我的onCreate方法再次運行,並且我的列表視圖項目增加(例如,如果我有1個問題,之後點擊後退按鈕顯示我的問題變成2)。

這是我的第一個活動:

public class Home extends Activity { 

static SharedPreferences prefs; 
Editor editor; 
HorizontalListView hListView; 
MyArrayAdapter listAdapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    loadObjects(); 


    prefs = getSharedPreferences(DataStore.MY_PREFS_NAME, MODE_PRIVATE); 
    editor = prefs.edit(); 
    editor.putInt("l" + 1, Question.KEY_UNLOCK); 
    editor.commit(); 


    hListView = (HorizontalListView) findViewById(R.id.list_view); 
    listAdapter = new MyArrayAdapter(this, DataStore.questions); 
    hListView.setAdapter(listAdapter); 
    hListView.scrollTo(prefs.getInt("level", 0)); 
    hListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) { 
      int lock = prefs.getInt("l" + DataStore.questions.get(index).level, Question.KEY_LOCK); 
      if (lock == Question.KEY_LOCK) 
       showLockAction(); 
      else { 
       Intent intent = new Intent(Home.this, MainActivity.class); 
       intent.putExtra("selected_level", index); 
       startActivity(intent); 
      } 
     } 
    }); 


} 

protected void showLockAction() { 
    Toast.makeText(Home.this, "مرحله های قبل و کامل کن", Toast.LENGTH_LONG).show(); 

} 


public void loadObjects() { 

    String KEY_QUESTION = "question"; 
    String KEY_OPTION1 = "option1"; 
    String KEY_OPTION2 = "option2"; 
    String KEY_OPTION3 = "option3"; 
    String KEY_OPTION4 = "option4"; 
    String KEY_QUESTION_IMAGE = "image"; 
    String KEY_LOCK = "level"; 
    String KEY_ANSWER = "answer"; 

    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromAssets(Home.this); 
    Document doc = parser.getDomElement(xml); // getting DOM element 

    NodeList nl = doc.getElementsByTagName(KEY_QUESTION); 
    // looping through all song nodes <song> 

    for (int i = 0; i < nl.getLength(); i++) { 
     Element e = (Element) nl.item(i); 
     Question q = new Question(); 
     q.image = parser.getValue(e, KEY_QUESTION_IMAGE); 
     q.options.add(parser.getValue(e, KEY_OPTION1)); 
     q.options.add(parser.getValue(e, KEY_OPTION2)); 
     q.options.add(parser.getValue(e, KEY_OPTION3)); 
     q.options.add(parser.getValue(e, KEY_OPTION4)); 
     q.level = Integer.parseInt(parser.getValue(e, KEY_LOCK)); 
     q.answer = Integer.parseInt(parser.getValue(e, KEY_ANSWER)); 

     DataStore.questions.add(q); 
    } 
} 

} 

我裝入對象方法的運行和反覆運行。

,這裏是我的第二個活動:

public class MainActivity extends Activity { 

ImageView questionText; 
TextView level; 
ImageView option1; 
ImageView option2; 
ImageView option3; 
ImageView option4; 
ImageView dialog; 
Button nextLevel; 

LinearLayout mainLayout; 
Question curQuestion; 
int curQuestionIndex = 0; 
int wrongCounter = 1; 
SharedPreferences prefs; 
Editor editor; 
ArrayList<Integer> list; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main3); 


    mainLayout = (LinearLayout) findViewById(R.id.main_lay); 
    dialog = (ImageView) findViewById(R.id.dialog); 
    level = (TextView) findViewById(R.id.level); 
    nextLevel = (Button) findViewById(R.id.next_level); 
    nextLevel.setOnClickListener(nextLevelClick); 

    questionText = (ImageView) findViewById(R.id.question); 
    option1 = (ImageView) findViewById(R.id.option1); 
    option2 = (ImageView) findViewById(R.id.option2); 
    option3 = (ImageView) findViewById(R.id.option3); 
    option4 = (ImageView) findViewById(R.id.option4); 

    option1.setOnClickListener(clickListener); 
    option2.setOnClickListener(clickListener); 
    option3.setOnClickListener(clickListener); 
    option4.setOnClickListener(clickListener); 


    prefs = getSharedPreferences(DataStore.MY_PREFS_NAME, MODE_PRIVATE); 
    editor = prefs.edit(); 

    curQuestionIndex = getIntent().getIntExtra("selected_level", 0); 

    loadNewQuestion(); 
} 


OnClickListener nextLevelClick = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     stopCorrectAnswerAction(); 
     curQuestionIndex++; 
     loadNewQuestion(); 
    } 
}; 

OnClickListener clickListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     if (curQuestion.isAnswer(v.getId())) { 
      correctAnswerAction(); 

     } else 
      wrongAnswerAction(); 

    } 
}; 


private void loadNewQuestion() { 

    Log.e("load", "@------loading------> " + curQuestionIndex); 
    if (curQuestionIndex == DataStore.questions.size()) { 
     gameFinishedAction(); 
     curQuestionIndex = 0; 
     return; 
    } 

    curQuestion = DataStore.questions.get(curQuestionIndex); 
    editor.putInt("level", curQuestionIndex + 1); 
    editor.putInt("l" + curQuestion.level, Question.KEY_UNLOCK); 
    editor.commit(); 

    wrongCounter = 1; 


    level.setText("مرحله " + curQuestion.level); 
    dialog.setImageResource(R.drawable.cl_q); 

    questionText.setImageBitmap(getBitmapFromAsset(curQuestion.image)); 
    option1.setImageBitmap(getBitmapFromAsset(curQuestion.options.get(0))); 
    option2.setImageBitmap(getBitmapFromAsset(curQuestion.options.get(1))); 
    option3.setImageBitmap(getBitmapFromAsset(curQuestion.options.get(2))); 
    option4.setImageBitmap(getBitmapFromAsset(curQuestion.options.get(3))); 

} 


private void gameFinishedAction() { 
    // TODO Auto-generated method stub 

} 


protected void wrongAnswerAction() { 
    if (wrongCounter % 3 == 1) 
     dialog.setImageResource(R.drawable.cl_w1); 
    else if (wrongCounter % 3 == 2) 
     dialog.setImageResource(R.drawable.cl_w2); 
    else if (wrongCounter % 3 == 0) 
     dialog.setImageResource(R.drawable.cl_w3); 
    wrongCounter++; 
} 

protected void correctAnswerAction() { 
    //mainLayout.setAlpha(0.5f); 
    dialog.setImageResource(R.drawable.cl_c); 
    nextLevel.setVisibility(View.VISIBLE); 

    option1.setOnClickListener(null); 
    option2.setOnClickListener(null); 
    option3.setOnClickListener(null); 
    option4.setOnClickListener(null); 


    //Toast.makeText(getApplicationContext(), "درسته",Toast.LENGTH_LONG).show(); 
} 

protected void stopCorrectAnswerAction() { 
    //mainLayout.setAlpha(1); 
    nextLevel.setVisibility(View.INVISIBLE); 

    option1.setOnClickListener(clickListener); 
    option2.setOnClickListener(clickListener); 
    option3.setOnClickListener(clickListener); 
    option4.setOnClickListener(clickListener); 
} 


private Bitmap getBitmapFromAsset(String strName) { 
    AssetManager assetManager = MainActivity.this.getAssets(); 
    InputStream istr = null; 
    try { 
     istr = assetManager.open(strName); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Bitmap bitmap = BitmapFactory.decodeStream(istr); 
    return bitmap; 
} 

@Override 
public void onBackPressed() { 
    startActivity(new Intent(MainActivity.this, Home.class)); 
    this.finish(); 
} 

當我做這個方法

@Override 
public void onBackPressed() { 
    startActivity(new Intent(MainActivity.this, Home.class)); 
    this.finish(); 
} 

我的第一個活動的onCreate再次運行。 如何防止此操作?

+0

不要重寫'onBackPressed'和'Home'活動將從堆棧 –

+0

打開,當我打開該活動時,它不會發生任何變化,它會運行ag ain – user7908469

回答

1

只需添加下面一行在你AndroidManifest - <activity>具有的ListView

android:launchMode="singleTask" 

這樣,

<activity 
      android:name=".MainActivity" 
      android:launchMode="singleTask"/> 
+0

我之前測試過,沒有什麼變化 – user7908469

+0

比你使用Intent for call actiivty –

+0

https://stackoverflow.com/questions/21446361/android-listview-duplicates-itself-when-i-launch-a-new-activity-並按回參考此鏈接 –

1

刪除線startActivity(new Intent(MainActivity.this, Home.class));和剛剛離開調用finish()