2017-01-24 4 views
0

Ich bin neu in Android-Entwicklung und ich versuche, einen booleschen Wert von Dialogfragment an die Aktivität zu übergeben.Boolescher Wert von Fragmenten an Aktivität übergeben

Der boolesche Wert sollte vom Benutzer bestimmt werden (hängt davon ab, auf welche Schaltfläche Benutzer geklickt hat). Der Boolean-Wert wurde jedoch sofort auf false umgestellt, ohne auf eine Schaltfläche zu klicken.

Ich habe versucht, verschiedene Verfahren empfohlen ich im Internet gefunden, aber keiner von ihnen arbeitet für mich (ich glaube, ich habe einen Teil vermasselte ...), diese Methode ist:

AUSSTRAHLUNG Schnittstelle -implementing -intent.putExtra

und unten ist der Code, den ich mir ausgedacht habe, könnte mir jemand helfen, einen Blick zu werfen? Jede Hilfe wird geschätzt.

Stage:

package com.example.fuj.valorsafeworldbytrade; 

import android.support.v4.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 

import static com.example.fuj.valorsafeworldbytrade.LosingDialogFragment.LOSING_FRAGMENT; 

public class Stage extends AppCompatActivity { 

String stage; 
FragmentManager fragmentManager = getSupportFragmentManager(); 
LosingDialogFragment losingDialogFragment = new LosingDialogFragment(); 
BasicInfo basicInfo = new BasicInfo(); 

public void setText(){ 
    TextView cpuReputation = (TextView) findViewById(R.id.cpu_reputation); 
    TextView cpuGold = (TextView) findViewById(R.id.cpu_gold); 
    TextView pGoldText = (TextView) findViewById(R.id.player_gold); 
    TextView pRepText = (TextView) findViewById(R.id.player_reputation); 
    cpuReputation.setText(String.valueOf(basicInfo.cRep)); 
    cpuGold.setText(String.valueOf(basicInfo.cGold)); 
    pGoldText.setText(String.valueOf(basicInfo.pGold)); 
    pRepText.setText(String.valueOf(basicInfo.pRep)); 
} 

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

} 

protected void onStart() { 
    super.onStart(); 
    stage = getIntent().getStringExtra(StageChoosingMenu.STAGE); 
} 


public void playerChoice(View view) { 
    boolean deceiveEnabled; 
    switch (view.getId()) { 
     case R.id.cooperate_button: 
      deceiveEnabled = false; 
      break; 

     case R.id.deceive_button: 
      deceiveEnabled = true; 
      break; 

     default: 
      throw new RuntimeException("Unknown Button ID"); 
    } 
    switch (stage){ 
     case "xumo": 
      xuMo(deceiveEnabled); 
      break; 

    } 


} 

public void xuMo(boolean playerDeceiveEnabled){ 
    boolean cpuDeceiveEnabled; 
    cpuDeceiveEnabled = (Math.random() - basicInfo.faith > 0); 

    if (cpuDeceiveEnabled){ 
     if (playerDeceiveEnabled){ 
      basicInfo.playerDvsCpuD(); 
      // faith changes to be amend w/ proper value, need record on the change of status 
     } 
     if (!playerDeceiveEnabled){ 
      basicInfo.playerCvsCpuD(); 
     } 
    } 

    if (!cpuDeceiveEnabled){ 
     if (playerDeceiveEnabled){ 
      basicInfo.playerDvsCpuC(); 
     } 
     if (!playerDeceiveEnabled){ 
      basicInfo.playerCvsCpuC(); 
     } 
    } 
    if(basicInfo.pGold <= 0 || basicInfo.cGold <= 0 || basicInfo.pRep <= 0 || basicInfo.cRep <= 0){ 
     //to be changed 
     setText(); 
     losingDialogFragment.show(fragmentManager,LOSING_FRAGMENT); 
//trying to show a alert dialog fragment 
     Log.d("True", String.valueOf(losingDialogFragment.tryAgainEnabled)); 

     if(losingDialogFragment.tryAgainEnabled){//tryAgainEnabled is always false 
//This is the part that I wanted to retrieve data from the user(if they want to try again or not) 
      basicInfo.reset(); 
      losingDialogFragment.dismiss(); 

     }else{ 
      losingDialogFragment.dismiss(); 
     } 
    } 
    setText(); 
     // to be changed 

} 
} 

LosingDialogFragment:

package com.example.fuj.valorsafeworldbytrade; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
/** 
* Created by fuj on 20/1/2017. 
*/ 

public class LosingDialogFragment extends DialogFragment{ 

public static final String LOSING_FRAGMENT = "LOSING"; 
public boolean tryAgainEnabled; 

Intent intent = new Intent(); 


@Override 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View rootView = inflater.inflate(R.layout.fragment_lose, container, false);; 
//the following code is used to set the boolean value after the user click the button 

    final Button tryAgainButton = (Button)rootView.findViewById(R.id.try_again_button); 
    tryAgainButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tryAgainEnabled = true; 
     } 
    }); 

    Button giveUpButton =(Button)rootView.findViewById(R.id.give_up_button); 
    giveUpButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tryAgainEnabled = false; 
     } 
    }); 
    getDialog().setTitle(LOSING_FRAGMENT); 
    return rootView; 
} 
} 

Ich bin auch traurig, dass ich mit Englisch nicht das beste bin, wenn irgendwelche Dinge wegen meines schlechten Englisch nicht klar oder nicht höflich ist, bitte lassen Sie mich freundlicherweise wissen. Ich entschuldige mich im Voraus für die Fehler, die ich gemacht habe.

+0

static boolean in Haupt-Aktivität erstellen und im Dialog verwenden fragment –

+0

was willst du erreichen kannst du im code anzeigen? – AJay

+1

@Divyesh statische ist nicht der beste Weg – AJay

Antwort

0

Es ist, weil Sie den Wert tryAgainEnabled genau richtig überprüfen, nachdem die Dialog zeigte. Dialog startet Asynchronously, es bedeutet, dass es in verschiedenen Thread startet und Ihr aktueller Thread nicht auf Dialog warten, so läuft diese Zeile Ihres Codes if(losingDialogFragment.tryAgainEnabled){ genau nach dem Sie Dialogfeld anzeigen, bevor Sie Wert auf tryAgainEnabled setzen. Da der Standardwert boolean immer false ist, erhalten Sie jedes Mal false.

Ich schlage vor, dass die Verwendung Zuhörer dafür:

Dialog:

public class LosingDialogFragment extends DialogFragment { 

    public static final String LOSING_FRAGMENT = "LOSING"; 
    public boolean tryAgainEnabled; 

    Intent intent = new Intent(); 


    private View.OnClickListener onTryAgainButtonClickLisnter; 
    private View.OnClickListener onGiveUpButtonClickLisnter; 
    @Override 
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View rootView = inflater.inflate(R.layout.fragment_lose, container, false);; 

     final Button tryAgainButton = (Button)rootView.findViewById(R.id.try_again_button); 
     tryAgainButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      if(onTryAgainButtonClickLisnter!=null) 
       onTryAgainButtonClickLisnter.onClick(v); 
      } 
     }); 

     Button giveUpButton =(Button)rootView.findViewById(R.id.give_up_button); 
     giveUpButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(onGiveUpButtonClickLisnter!=null) 
        onGiveUpButtonClickLisnter.onClick(v); 
      } 
     }); 
     getDialog().setTitle(LOSING_FRAGMENT); 
     return rootView; 
    } 

    public void setOnTryAgainButtonClickLisnter(View.OnClickListener onTryAgainButtonClickLisnter) { 
     this.onTryAgainButtonClickLisnter = onTryAgainButtonClickLisnter; 
    } 

    public void setOnGiveUpButtonClickLisnter(View.OnClickListener onGiveUpButtonClickLisnter) { 
     this.onGiveUpButtonClickLisnter = onGiveUpButtonClickLisnter; 
    } 
} 

In Ihrer Tätigkeit Aufruf Dialog wie folgt aus:

LosingDialogFragment losingDialogFragment = new LosingDialogFragment(); 
    losingDialogFragment.setOnTryAgainButtonClickLisnter(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      tryAgain(); 
      losingDialogFragment.dismiss(); 
     } 
    }); 
    losingDialogFragment.setOnGiveUpButtonClickLisnter(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      giveUp(); 
      losingDialogFragment.dismiss(); 
     } 
    }); 
losingDialogFragment.show(fragmentManager, ""); 
+0

Ich habe versucht, Ihre Methode, aber scheint es nicht für mich arbeiten – Noobnewbier

+0

Ich fürchte, ich mache es falsch ... aber ich kopiere die Fehlermeldung, so dass Sie möchten ein Blick – Noobnewbier

+0

FATALE AUSNAHME: Haupt Prozess: com.beispiel.fuj.valorsafetheorldbytrade, PID: 3931 java.lang.IllegalStateException: Konnte Methode für android nicht ausführen: onClick – Noobnewbier

0

Erklären Sie public boolean tryAgainEnabled; in Ihrer Stage Aktivität und Sie können diese Variable mit ((Stage)context).tryAgainEnabled aktualisieren.

package com.example.fuj.valorsafeworldbytrade; 

import android.support.v4.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 

import static com.example.fuj.valorsafeworldbytrade.LosingDialogFragment.LOSING_FRAGMENT; 

public class Stage extends AppCompatActivity { 

String stage; 
FragmentManager fragmentManager = getSupportFragmentManager(); 
LosingDialogFragment losingDialogFragment = new LosingDialogFragment(); 
BasicInfo basicInfo = new BasicInfo(); 
public boolean tryAgainEnabled; 
public void setText(){ 
    TextView cpuReputation = (TextView) findViewById(R.id.cpu_reputation); 
    TextView cpuGold = (TextView) findViewById(R.id.cpu_gold); 
    TextView pGoldText = (TextView) findViewById(R.id.player_gold); 
    TextView pRepText = (TextView) findViewById(R.id.player_reputation); 
    cpuReputation.setText(String.valueOf(basicInfo.cRep)); 
    cpuGold.setText(String.valueOf(basicInfo.cGold)); 
    pGoldText.setText(String.valueOf(basicInfo.pGold)); 
    pRepText.setText(String.valueOf(basicInfo.pRep)); 
} 

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

} 

protected void onStart() { 
    super.onStart(); 
    stage = getIntent().getStringExtra(StageChoosingMenu.STAGE); 
} 


public void playerChoice(View view) { 
    boolean deceiveEnabled; 
    switch (view.getId()) { 
     case R.id.cooperate_button: 
      deceiveEnabled = false; 
      break; 

     case R.id.deceive_button: 
      deceiveEnabled = true; 
      break; 

     default: 
      throw new RuntimeException("Unknown Button ID"); 
    } 
    switch (stage){ 
     case "xumo": 
      xuMo(deceiveEnabled); 
      break; 

    } 


} 

public void xuMo(boolean playerDeceiveEnabled){ 
    boolean cpuDeceiveEnabled; 
    cpuDeceiveEnabled = (Math.random() - basicInfo.faith > 0); 

    if (cpuDeceiveEnabled){ 
     if (playerDeceiveEnabled){ 
      basicInfo.playerDvsCpuD(); 
      // faith changes to be amend w/ proper value, need record on the change of status 
     } 
     if (!playerDeceiveEnabled){ 
      basicInfo.playerCvsCpuD(); 
     } 
    } 

    if (!cpuDeceiveEnabled){ 
     if (playerDeceiveEnabled){ 
      basicInfo.playerDvsCpuC(); 
     } 
     if (!playerDeceiveEnabled){ 
      basicInfo.playerCvsCpuC(); 
     } 
    } 
    if(basicInfo.pGold <= 0 || basicInfo.cGold <= 0 || basicInfo.pRep <= 0 || basicInfo.cRep <= 0){ 
     //to be changed 
     setText(); 
     losingDialogFragment.show(fragmentManager,LOSING_FRAGMENT); 
     Log.d("True", String.valueOf(losingDialogFragment.tryAgainEnabled)); 

     if(losingDialogFragment.tryAgainEnabled){//tryAgainEnabled is always false 
      basicInfo.reset(); 
      losingDialogFragment.dismiss(); 
     }else{ 
      losingDialogFragment.dismiss(); 
     } 
    } 
    setText(); 
     // to be changed 

} 
} 

Und in Fragmente

package com.example.fuj.valorsafeworldbytrade; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
/** 
* Created by fuj on 20/1/2017. 
*/ 

public class LosingDialogFragment extends DialogFragment{ 

public static final String LOSING_FRAGMENT = "LOSING"; 
Context context; 
Intent intent = new Intent(); 


@Override 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View rootView = inflater.inflate(R.layout.fragment_lose, container, false);; 

    final Button tryAgainButton = (Button)rootView.findViewById(R.id.try_again_button); 
    tryAgainButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((Stage)context).tryAgainEnabled = true; 
     } 
    }); 

    Button giveUpButton =(Button)rootView.findViewById(R.id.give_up_button); 
    giveUpButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((Stage)context).tryAgainEnabled = false; 
     } 
    }); 
    getDialog().setTitle(LOSING_FRAGMENT); 
    return rootView; 
} 
} 
+0

Entschuldigung ...der tryAgainEnabled Wert ist immer noch falsch – Noobnewbier

+0

aber thx für die Hilfe – Noobnewbier

Verwandte Themen