안드로이드 개발 질문/답변
(글 수 45,052)
대략..
tab 이랑 viewpager 사용해서 구현했습니다.
대체로 정상 동작하는데요.
화면을 끄면 (전원버튼 눌러서 대기모드로) 아래와 같이 에러를 내뿜고 app 이 종료됩니다.
fragment manager 에서 오류가 발생하는거 같은데 어떤 원인인지 모르겠네요...
익스플로어로 로그인 해서 코드 전문 추가합니다.
아직 다른 기능은 없어서 보시기엔 편할거예요.
import java.util.List;
import java.util.Vector;
import net.oartism.core.PagerAdapter;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
public class MainActivity extends FragmentActivity
implements TabHost.OnTabChangeListener,
TabHost.TabContentFactory,
ViewPager.OnPageChangeListener {
private TabHost tabHost;
private ViewPager viewPager;
private PagerAdapter pagerAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
|WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
initializeTabHost();
initializeViewPager();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("tabTag", tabHost.getCurrentTabTag());
super.onSaveInstanceState(outState);
}
private void AddTab(int indicatorId, TabHost tabHost, String tag) {
View v = LayoutInflater.from(this).inflate(indicatorId, null);
TextView tv = (TextView) v.findViewById(R.id.tvTabIndicator);
tv.setText(tag);
TabSpec tabSpec = tabHost.newTabSpec(tag).setIndicator(v).setContent(this);
tabHost.addTab(tabSpec);
}
private void initializeTabHost() {
tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
AddTab(R.layout.tab_indicator, tabHost, getString(R.string.tab1));
AddTab(R.layout.tab_indicator, tabHost, getString(R.string.tab2));
AddTab(R.layout.tab_indicator, tabHost, getString(R.string.tab3));
AddTab(R.layout.tab_indicator, tabHost, getString(R.string.tab4));
for(int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {
tabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 60;
}
tabHost.setOnTabChangedListener(this);
}
private void initializeViewPager() {
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName()));
fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName()));
fragments.add(Fragment.instantiate(this, Tab3Fragment.class.getName()));
fragments.add(Fragment.instantiate(this, Tab4Fragment.class.getName()));
pagerAdapter = new PagerAdapter(getSupportFragmentManager(), fragments);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(pagerAdapter);
viewPager.setOnPageChangeListener(this);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
return true;
case KeyEvent.KEYCODE_SEARCH:
return true;
case KeyEvent.KEYCODE_MENU:
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override public void onTabChanged(String tabId) { viewPager.setCurrentItem(tabHost.getCurrentTab()); }
@Override public void onPageSelected(int position) { tabHost.setCurrentTab(position); }
@Override public void onPageScrolled(int arg0, float arg1, int arg2) {}
@Override public void onPageScrollStateChanged(int state) {}
@Override public View createTabContent(String tag) { return new View(this); }
}01-23 20:08:36.453: E/AndroidRuntime(4823): FATAL EXCEPTION: main
01-23 20:08:36.453: E/AndroidRuntime(4823): java.lang.NullPointerException
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1617)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:481)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.Activity.performSaveInstanceState(Activity.java:1113)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1185)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2793)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2851)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.ActivityThread.access$900(ActivityThread.java:123)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.os.Looper.loop(Looper.java:137)
01-23 20:08:36.453: E/AndroidRuntime(4823): at android.app.ActivityThread.main(ActivityThread.java:4424)
01-23 20:08:36.453: E/AndroidRuntime(4823): at java.lang.reflect.Method.invokeNative(Native Method)
01-23 20:08:36.453: E/AndroidRuntime(4823): at java.lang.reflect.Method.invoke(Method.java:511)
01-23 20:08:36.453: E/AndroidRuntime(4823): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-23 20:08:36.453: E/AndroidRuntime(4823): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-23 20:08:36.453: E/AndroidRuntime(4823): at dalvik.system.NativeStart.main(Native Method)




Pause 했을때 상태를 저장하는데 객체가 소멸되어서 저장할게 없어서 null 포인터나는듯요
onSaveInstanceState 가 핵심일거같네유...