2016-12-27 6 views
1

私は書いているAndroidアプリのダイアログにを使用しています。ユーザーにタイマーの期間を入力させ、その期間を呼び出しているアクティビティに戻すようにします。私は既にこの問題に関してSOに質問に答えていることを知っていますが、私は何か仕事を得ることができませんでした。ここでダイアログフラグメントから変数を取得し、それを呼び出すアクティビティに戻る

は活動です:

public class train extends AppCompatActivity { 
    public Integer customTimerlength = null; 
    public Integer timerDurationSeconds = 180; // 3 minutes is a good default value 
    public boolean timerIsPaused; 
    public long millisLeftOnTimer; 
    Button startBreakTimerButton; 
    Button stopBreakTimerButton; 
    Button pauseBreakTimerButton; 
    TextView breakTimerOutput; 
    CountDownTimer countdowntimer; 
    private CountDownTimer mCountDownTimer; 

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

     startBreakTimerButton = (Button) findViewById(R.id.startBreakTimer); 
     stopBreakTimerButton = (Button) findViewById(R.id.stopBreakButton); 
     pauseBreakTimerButton = (Button) findViewById(R.id.pauseBreakButton); 
     breakTimerOutput = (TextView) findViewById(R.id.breakTimerOutput); 

     // Break timer long-click set time 
     breakTimerOutput.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       //customTimerlength = timerLengthInputAlert(); 

       new RestDurationPicker().show(getFragmentManager(), "Session break length"); 

、ここでは、フラグメントである:

import android.widget.Toast; 
import mobi.upod.timedurationpicker.TimeDurationPicker; 
import mobi.upod.timedurationpicker.TimeDurationPickerDialogFragment; 

public class RestDurationPicker extends TimeDurationPickerDialogFragment { 

    @Override 
    protected long getInitialDuration() { 
     return 0; // Default to empty 
    } 

    @Override 
    protected int setTimeUnits() { 
     return TimeDurationPicker.MM_SS; 
    } 

    @Override 
    public void onDurationSet(TimeDurationPicker view, long duration) { 
     Toast.makeText(getContext(), "New break duration set", Toast.LENGTH_LONG).show(); 
    } 
} 

私はSO言及意図やインターフェイス上で、ここでかなりの数の答えを見つけたが、私はされていません何かを働かせることができ、私は迷っています。これは私の最初のAndroidアプリでの試みなので、何をすべきか分かりません。

本当にありがとうございます。

答えて

0

アクティビティがDialogFragmentから期間を受け取るためには、インタフェースを作成する必要があります。ここに例があります

public interface DurationListener { 
    void onDurationSet(long duration); 
} 

アクティビティは、このインターフェイスを実装する必要があります。つまり、onDurationSet()メソッドを実装することによって、アクティビティはインタフェースコントラクトの条件に従わなければなりません。

public class TrainActivity extends AppCompatActivity implements DurationListener { 
    //skipping most of your code 

    @Override 
    public void onDurationSet(long duration) { 
     //Do something with the duration 
    } 

} 

は、今すぐあなたのDialogFragmentに、あなたはDurationListenerを受け入れるようにコンストラクタを変更する必要があり、あなたは時間がユーザーによって変更されたときに、リスナーにonDurationSet()を呼び出す必要があります。

public class RestDurationPicker extends TimeDurationPickerDialogFragment { 
    private final DurationListener mListener; 

    public RestDurationPicker() {} 

    //The modified constructor, which accepts a listener as a parameter 
    public RestDurationPicker(DurationListener listener) { 
     mListener = listener; 
    } 

    //Most of your code goes here 

    @Override 
    public void onDurationSet(TimeDurationPicker view, long duration) { 
     //When the duration is set by the user, notify the listener 
     listener.onDurationSet(duration); 
    } 
} 

ここでDialogFragmentを作成すると、そのアクティビティをフラグメントに渡すだけで完了です。

//This code is in your onCreate method in your activity 
breakTimerOutput.setOnLongClickListener(new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 
     //customTimerlength = timerLengthInputAlert(); 

     new RestDurationPicker(this).show(getFragmentManager(), "Session break length"); 
    } 
}); 

追記:あなたがそれらをする理由がない限り、あなたはすなわち、クラスやメソッドのための正しい命名規則を使用し、プライベートまたは保護されたクラスのフィールドを保つことによって、あなたのコードは、JavaとAndroidのコーディングガイドラインに従って確認する必要がありますパブリック。このリンクはあなたに役立ちます:https://source.android.com/source/code-style.html

+0

恐ろしく、ありがとう!私は今それを試してみるつもりです。インタフェース定義は断片に入っていますが、正しいのでしょうか? –

+0

インターフェイス定義は、フラグメントまたはスタンドアロンファイルのいずれかに格納できます。 –

+0

もう1つ質問があります。あなたは言った: 'public class TrainActivity implements DurationListener {}'。 私は電車に乗っている命名規則の問題を無視して、現在持っているのは 'public class train AppCompatActivity'です。 しかし、私はあなたの例を試してみるとエラーが出ます( 'クラストレインは抽象宣言でなければならず、DurationListenerで抽象メソッドonDurationSetting(long)を実装する必要があります)。私はそれがおそらく私が望んでいるほど簡単ではないことを知っています。ここにどんなアイデア? –

1

それを実感してください!

私は私の活動にこれを追加しました:

// Break timer long-click set time 
@Override 
public void onDurationSet(long duration) { 
    Integer i = (int) (long) duration; // get integer i from duration (long) 
    customTimerlength = i/1000; // convert millis to seconds 

    // Set the timer duration in seconds 
    timerDurationSeconds = customTimerlength; 

    // Assign the new custom timer duration to the timerduration variable 
    breakTimerOutput.setText(Integer.toString(timerDurationSeconds)); 
    Log.d("NewTimer", "New Timer Duration: " + timerDurationSeconds); 
} 

public interface DurationListener { 
    void onDurationSet(long duration); 
} 

を必要に応じて、フラグメントが今の活動に時間を渡します。

関連する問題