0

Я пытаюсь реализовать PauseHandler описано здесь:Вызов SupportFragmentManager от реализации PauseHandler

https://stackoverflow.com/a/8122789/1977132

Моя деятельность является ActionBarActivity, код в методе ProcessMessage который вызывает диалог дает ошибку Cannot resolve method 'getSupportFragmentManager'

по предложению здесь: https://stackoverflow.com/a/27425568/1977132

Я попытался изменить его getFragmentManag э(), но затем я получаю ошибку Cannot resolve method 'show(android.app.FragmentManager(), java.lang.String'

Я приклеил, что я считаю, что соответствующий код здесь:

import android.support.v4.app.DialogFragment; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.ActionBarActivity; 

public class PlaySession extends ActionBarActivity implements View.OnClickListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState == null) { 
      final Fragment state = new State(); 
      final FragmentManager fm = getSupportFragmentManager(); 
      final FragmentTransaction ft = fm.beginTransaction(); 
      ft.add(state, State.TAG); 
      ft.commit(); 
     } 
    } 

    public static class rescanDialogBox extends DialogFragment { 
     final static String TAG = "RESCAN"; 

     public static rescanDialogBox newInstance(int title) { 
      rescanDialogBox frag = new rescanDialogBox(); 
      Bundle args = new Bundle(); 
      args.putInt("title", title); 
      frag.setArguments(args); 
      return frag; 
     } 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      String title = "Rescan?"; 
      String message = "No Bluetooth LE devices found. Do you want to rescan? If you keep getting this message check the battery of your Bluetooth device."; 

      AlertDialog.Builder myDialogBuilder = new AlertDialog.Builder(getActivity()); 
      myDialogBuilder.setTitle(title); 
      myDialogBuilder.setMessage(message); 
      myDialogBuilder.setPositiveButton("YES", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         ((PlaySession) getActivity()).yesRescan(); 
        } 
       }); 
      myDialogBuilder.setNegativeButton("NO", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         ((PlaySession) getActivity()).noRescan(); 
        } 
       }); 

      AlertDialog myDialog = myDialogBuilder.create(); 
      myDialog.setCanceledOnTouchOutside(false); 

      return myDialog; 
     } 
    } 

    public void yesRescan() { 
     //rescan 
    } 

    public void noRescan() { 
     //do nothing 
    } 

    final static class State extends Fragment { 
     static final String TAG = "State"; 
     public PauseHandlerImplementation handler = new PauseHandlerImplementation(); 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setRetainInstance(true); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      handler.setActivity(getActivity()); 
      handler.resume(); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      handler.pause(); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      handler.setActivity(null); 
     } 
    } 


    static class PauseHandlerImplementation extends PauseHandler { 
     protected Activity activity; 

     final void setActivity(Activity activity) { 
      this.activity = activity; 
     } 

     @Override 
     final protected void processMessage(String toDo) { 
      final Activity activity = this.activity; 

      if (activity != null) { 
       if(toDo.equals("OFFER_RESCAN")) { 
        //offer rescan 
        DialogFragment newFragment = new rescanDialogBox(); 
        newFragment.show(activity.getSupportFragmentManager(), rescanDialogBox.TAG); 
        activity.getSupportFragmentManager().executePendingTransactions(); 

       } else if (toDo.equals("OFFER_DEVICES")) { 
        //offer devices 
       } 
      } 
     } 
    } 
} 

Конечно, есть также код PauseHandler, который проходит Handler и код для диалогового окна, но это было/работает нормально, поэтому не кажется актуальным.

EDIT Добавлен код для диалогового окна ReScan, это диалоговое окно работало нормально, пока я добавил PauseHandler, но мне нужно, чтобы добавить поддержку для случая, когда пользователь переходит от приложения, а сканирование продолжается, следовательно, потребность в PauseHandler

+0

что rescanDialogBox? Не могли бы вы поделиться с ним кодом? – jayeshsolanki93

+0

@ jayeshsolanki93 Я добавил код для rescanDialogBox, спасибо за любые ваши идеи. – user1977132

+0

Хорошо, rescanDialogBox выглядит отлично. – jayeshsolanki93

ответ

0

Прежде всего, ActionBarActivity теперь устарел. Вероятно, вы должны использовать AppCompatActivity, чтобы иметь возможность поддерживать предыдущую версию Android.

Во-вторых, вы должны указать контейнер, куда поместить свой фрагмент состояния, с помощью метода .replace(int ontainerViewId, Fragment fragment). Ваш метод должен выглядеть так:

final Fragment state = new State(); 
final FragmentManager fm = getSupportFragmentManager(); 
final FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.your_container_id, state); 
ft.commit(); 

Надеюсь, это поможет!

+1

Сам фрагмент State не имеет никакого пользовательского интерфейса, поэтому он не добавляется в контейнер (onCreateView возвращает null - см. https://developer.android.com/reference/android/app/FragmentTransaction.html). Спасибо за предложение. – user1977132

0

У меня была такая же проблема, как у вас, я думаю, вы должны изменить

import android.support.v4.app.DialogFragment 

в

import android.app.DialogFragment; 

в вашем DialogFragment классе

Смежные вопросы