【发布时间】:2016-11-27 22:48:21
【问题描述】:
我正在尝试实现此处描述的 PauseHandler:
https://stackoverflow.com/a/8122789/1977132
我的活动是一个ActionBarActivity,processMessage方法中的代码会弹出一个对话框给出错误Cannot resolve method 'getSupportFragmentManager'
按照这里的建议: https://stackoverflow.com/a/27425568/1977132
我尝试将其更改为 getFragmentManager() 但随后出现错误 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
}
}
}
}
}
当然,还有用于扩展 Handler 的 PauseHandler 的代码和用于对话框的代码,但它们工作正常,因此似乎不相关。
编辑 添加了重新扫描对话框的代码,此对话框在我添加 PauseHandler 之前运行良好,但我需要添加对用户在扫描过程中离开应用程序的情况的支持,因此需要 PauseHandler
【问题讨论】:
-
什么是rescanDialogBox?可以分享一下代码吗?
-
@jayeshsolanki93 我已经添加了 rescanDialogBox 的代码,谢谢你的任何想法。
-
好的,rescanDialogBox 看起来不错。
-
当你已经将它作为
PauseHandlerImplementaion类的成员字段时,为什么还要在processMessage中创建一个新的activity变量?您是否也尝试过使用 getActivity() 代替? -
@jayeshsolanki93 我只是从我链接到的第一个答案中复制代码,它们似乎复制了活动变量。我不知道为什么。我尝试用 getActivity() 替换它,但随后错误变为
Cannot resolve method getActivity()
标签: java android android-fragments android-support-library android-handler