사용자가 표시 목록보기를 새로 고침 할 때마다 (항상 Gmail 응용 프로그램이나 reddit 동기화 응용 프로그램에서 수행하는 방식과 달리) 작업 표시 줄에 TextView를 오버레이하려고합니다. 나는 상쾌하게하기 위해 SwipeRefreshLayout을 사용하고있다. 그러나 나는 그것이 부적절하다고 생각한다. TextView를 보유하고있는 class (HeaderTransformer)를 가지고 TextManager를 디스플레이에 연결하기 위해 WindowManager를 사용합니다. HeaderTransformer 클래스의 인스턴스는 조각 내에서 호출됩니다 (SwipeRefreshLayout 및 ListView를 유지하여 새로 고침). 단편을 처음 만들 때 TextView 오버레이가 완벽하게 작동합니다. 그러나 화면을 회전 시키거나 조각을 다시 만들면 WindowManager는 TextView를 첨부하지 않고 BadTokenException을 발생시킵니다. 스택 트레이스 WindowManager.addView 오리엔테이션 변경시 BadTokenException
private HeaderTransformer ht;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_misc, container, false);
View refresh_header = getActivity().getLayoutInflater().inflate(R.layout.swipe_refresh_header_layout, null);
ht = new HeaderTransformer(getActivity(), refresh_header);
}
@Override
public void onResume() {
super.onResume();
getActivity().runOnUiThread(new Runnable(){
@Override
public void run() {
if(!getActivity().isFinishing())
ht.addHeaderViewToActivity(getActivity());
}
});
}
HeaderTransformer.java 여기
public class HeaderTransformer {
private View mHeaderView;
private TextView mMainTextView;
private Context mContext;
public HeaderTransformer(Context context, View headerView) {
mHeaderView = headerView;
mContext = context;
mMainTextView = (TextView) headerView.findViewById(R.id.ptr_text);
}
public void onReset() {
mMainTextView.setVisibility(View.VISIBLE);
mMainTextView.setText(R.string.pull_to_refresh_label);
}
public void onRefreshStarted() {
mMainTextView.setText(R.string.refreshing_label);
}
public void addHeaderViewToActivity(Activity mActivity) {
Rect mRect = new Rect();
// Get the Display Rect of the Decor View
mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(mRect);
// Honour the requested layout params
int width = WindowManager.LayoutParams.MATCH_PARENT;
int height = WindowManager.LayoutParams.WRAP_CONTENT;
ViewGroup.LayoutParams requestedLp = mHeaderView.getLayoutParams();
if (requestedLp != null) {
width = requestedLp.width;
height = requestedLp.height;
}
// Create LayoutParams for adding the View as a panel
WindowManager.LayoutParams wlp = new WindowManager.LayoutParams(width, height,
WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
wlp.x = 0;
wlp.y = mRect.top;
wlp.gravity = Gravity.TOP | Gravity.LEFT;
// Workaround for Issue #182
mHeaderView.setTag(wlp);
try{
mActivity.getWindowManager().addView(mHeaderView, wlp);
}
catch(Exception e){
e.printStackTrace();
}
}
것 :
05-14 00:09:03.286: W/System.err(18190): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
05-14 00:09:03.286: W/System.err(18190): at android.view.ViewRootImpl.setView(ViewRootImpl.java)
05-14 00:09:03.286: W/System.err(18190): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)
05-14 00:09:03.286: W/System.err(18190): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java)
05-14 00:09:03.286: W/System.err(18190): at com.faisalalqadi.resume.util.HeaderTransformer.addHeaderViewToActivity(HeaderTransformer.java:72)
05-14 00:09:03.286: W/System.err(18190):at com.faisalalqadi.resume.fragment.MiscellaneousFragment$3.run(MiscellaneousFragment.java:260)
05-14 00:09:03.286: W/System.err(18190): at android.app.Activity.runOnUiThread(Activity.java)
05-14 00:09:03.286: W/System.err(18190): at com.faisalalqadi.resume.fragment.MiscellaneousFragment.onResume(MiscellaneousFragment.java:256)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.Fragment.performResume(Fragment.java:1543)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:974)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1097)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1905)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:466)
05-14 00:09:03.296: W/System.err(18190): at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:455)
05-14 00:09:03.296: W/System.err(18190): at android.app.Activity.performResume(Activity.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.performResumeActivity(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.access$900(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at android.os.Handler.dispatchMessage(Handler.java)
05-14 00:09:03.296: W/System.err(18190): at android.os.Looper.loop(Looper.java)
05-14 00:09:03.296: W/System.err(18190): at android.app.ActivityThread.main(ActivityThread.java)
05-14 00:09:03.296: W/System.err(18190): at java.lang.reflect.Method.invokeNative(Native Method)
05-14 00:09:03.296: W/System.err(18190): at java.lang.reflect.Method.invoke(Method.java)
05-14 00:09:03.296: W/System.err(18190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
나는 모든 찾고 있었어요
http://stackoverflow.com/questions/4187673/problems-creating- a-pop-window-in-android-activity는이 링크를 보았습니다 – duggu