0

Activity と関連する Fragment (FragmentFive) に拡張される Activity (MainActivity) があります。

MainActivity から値にアクセスしたい Fragment に配置されたシークバーがあります。どうやってするの?API レベル 18以上のみ。

MainActivity には、クリックすると FragmentFive に向かうボタンがあります: android:onClick= "goFag5"

Activity のサンプル コードは非常に役立ちます。フラグメントのコードは次のとおりです。

FragmentFive.java

public class FragmentFive extends Fragment {

private SeekBar RedBar; 

public FragmentFive() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_five, container,
            false);

    RedBar = (SeekBar) v.findViewById(R.id.seekBar1);

    RedBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            Log.d("HM", progress+": value");


        }
    });

    return v;
    }

}

Mainactivity のコード

public void gofag5(View v) {
    // TODO Auto-generated method stub
    FragmentFive frag = new FragmentFive();
    FragmentManager fm = getFragmentManager(); // import
    FragmentTransaction ftr = fm.beginTransaction(); // import
    ftr.add(R.id.mainlayout, frag, "keyFrag");
    ftr.addToBackStack(null);
    ftr.commit();

}
4

2 に答える 2

0

Fragment に SeekBarのgetterandを作成できます。setterアクティビティでは、フラグメントを保持する必要があります。どのようにフラグメントを作成したかによって異なります。プログラムで作成した場合は、次のように作成したため、おそらく既にそのインスタンスがあります。

MyFragment myFragment = new Fragment(); 

または、フラグメントが XML レイアウト ファイルに埋め込まれている場合は、次のようなものを使用できます。

myFragment = getFragmentManager().findFragmentById(R.id.myFragment); 

次に、次のことができます。

myFragment.getSeekBar(); 

注: 上記は疑似コードであり、動作しませんが、アイデアが得られるはずです。2 番目のアプローチを使用する場合はcast、Fragment to MyFragment が必要になります。

于 2014-06-10T19:59:26.377 に答える
0

インターフェイスを使用して、フラグメントからアクティビティを呼び出すことができます。

public class SettingFollow extends Fragment implements 
    OnSeekBarChangeListener {

public interface BestRidesFollowDialogListener {
    void onSettingFollowChange(int progress);
}

BestRidesFollowDialogListener bestRidesFollowDialogListener;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // the activity may be null if this is called without implementing the
    // interface 

    activity = getActivity();
    bestRidesFollowDialogListener = (BestRidesFollowDialogListener.class
            .isAssignableFrom(activity.getClass())) ? (BestRidesFollowDialogListener) activity
            : null;
    view = inflater.inflate(R.layout.settings_follow, container,
            false);
    return view;
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
    // we save and process the value here

    switch (seekBar.getId()) {
    case R.id.sbFollowMillis:
    //call through the interface if its non null the 
            // only time its null is when the programmer has 
            // not implemented the interface in the activity that started
            // the fragment.

                if (bestRidesFollowDialogListener != null) {
        bestRidesFollowDialogListener.onSettingFollowChange(seekBar.getProgress());
    }

}

次に、アクティビティで、上記の例では BestRidesFollowDialogListener と呼ばれるフラグメントのインターフェイスを実装し、IDE でスタブを作成できるようにします。

フラグメントにシークバーの値を保存することは示されていません。シークバーをフラグメントに保存された値に初期化します。長いクラス名で申し訳ありませんが、アクティビティで処理するフラグメント インターフェイスがいくつかある場合は、長いクラス名とメソッド名が本当に役に立ちます。

于 2014-06-10T23:24:09.717 に答える