2013-04-30 2 views
0

여기 내 앱의 범위는 다음과 같습니다.활동을 시작할 수 없습니다. ComponentInfo - 어떻게 수정합니까?

ViewPager 및 Fragment를 사용하여 앱을 작성하려고합니다. 앱의 레이아웃에는 2 개의 탭 (홈/구성)이 있습니다. 이 탭 중 하나의 단편을 다른 탭으로 바꿀 수 있습니다. 예 : * FragmentHome (TabHome에서)이 FragmentGraphics로 대체되었습니다. 사용자가 버튼을 다시 누르면 FragmentHome이 다시 표시됩니다.

문제 (1) : 앱이 닫히고 열리기 전에 닫습니다. 나는 무슨 일이 일어날 지 모른다. 문제점 (2) : 뷰 호출기에서 조각을 다른 것으로 대체하려면 어떻게합니까? (FragmentHome의 button1ClickListener)?

도움을 받으시기 바랍니다.

코드 :

ActivityMain.java

import java.util.List; 
import java.util.Vector; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 
import android.widget.TabHost; 
import android.widget.TabHost.TabSpec; 

public class ActivityMain extends FragmentActivity { 

    private TabHost mTabHost; 
    private PagerAdapter mPagerAdapter; 
    private ViewPager mViewPager; 

    List<Fragment> fragments = new Vector<Fragment>(); 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     this.setLayout(savedInstanceState); 

    } 

    @Override 
    public void onBackPressed() { 
     if(!mPagerAdapter.back(getSupportFragmentManager())) { 
     super.onBackPressed(); 
     } 
    }  

    public void setLayout(Bundle args){ 

     this.mViewPager = (ViewPager)findViewById(R.id.viewpager); 

     this.mTabHost = (TabHost)findViewById(android.R.id.tabhost);  

     //HomeTab 
     TabSpec tabSpecHome = mTabHost.newTabSpec(getResources().getString(R.string.tab_home_name)); 
     tabSpecHome.setIndicator(getResources().getString(R.string.tab_home_label)); 

     //ConfigTab 
     TabSpec tabSpecConfig = mTabHost.newTabSpec(getResources().getString(R.string.tab_config_name)); 
     tabSpecConfig.setIndicator(getResources().getString(R.string.tab_config_label)); 

     this.mPagerAdapter = new PagerAdapter(this, this.mTabHost,this.mViewPager); 

     //HomeTab 
     this.mPagerAdapter.addTab(tabSpecHome, FragmentHome.class, args); 
     this.mPagerAdapter.addFragment(getSupportFragmentManager(), getResources().getString(R.string.tab_home_name), FragmentHome.class, null); 

     //ConfigTab 
     this.mPagerAdapter.addTab(tabSpecConfig, FragmentConfig.class, args); 
     this.mPagerAdapter.addFragment(getSupportFragmentManager(), getResources().getString(R.string.tab_config_name), FragmentConfig.class, null); 

    } 
} 

PagerAdapter.java

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Stack; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.view.ViewGroup; 
import android.widget.TabHost; 
import android.widget.TabHost.TabSpec; 
import android.widget.TabWidget; 

public class PagerAdapter extends FragmentPagerAdapter { 

    private final Context mContext; 
    private final TabHost mTabHost; 
    private final ViewPager mViewPager; 

    private ArrayList<String> mTabTags = new ArrayList<String>(); 
    private HashMap<String, Stack<TabInfo>> mTabStackMap = new HashMap<String, Stack<TabInfo>>(); 

    public interface SaveStateBundle{ 
     public Bundle onRemoveFragment(Bundle outState); 
    } 

    public PagerAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager){ 

     super(activity.getSupportFragmentManager()); 
     this.mContext = activity; 

     this.mTabHost = tabHost; 
     this.mTabHost.setOnTabChangedListener(tabChangeListener); 

     this.mViewPager = pager; 
     this.mViewPager.setAdapter(this); 
     this.mViewPager.setOnPageChangeListener(viewPagerChangeListener); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Stack<TabInfo> tabStack = mTabStackMap.get(mTabTags.get(position)); 
     TabInfo info = tabStack.peek(); 
     return Fragment.instantiate(mContext, info.getClass().getName(), info.getArgs()); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     ArrayList<Class<?>> positionNoneHack = new ArrayList<Class<?>>(); 

     for(Stack<TabInfo> tabStack: mTabStackMap.values()){ 
      positionNoneHack.add(tabStack.peek().getClass()); 
     } 

     if(positionNoneHack.contains(object.getClass())){ 
      return POSITION_UNCHANGED; 
     } 

     return POSITION_NONE; 
    } 

    public void addTab(TabSpec tabSpec, Class<?> clss, Bundle args){ 

     try{ 

      this.mTabHost.setup(); 

      Stack<TabInfo> tabStack = new Stack<TabInfo>(); 

      tabSpec.setContent(new TabContent(this.mContext)); 
      this.mTabHost.addTab(tabSpec); 
      String tag = tabSpec.getTag(); 
      TabInfo info = new TabInfo(tag, clss, args); 

      this.mTabTags.add(tag); 
      tabStack.add(info); 
      this.mTabStackMap.put(tag, tabStack); 
      notifyDataSetChanged(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    }  

    public void addFragment(FragmentManager fm, String _tag, Class<?> _class, Bundle _args){ 

     try{ 

      TabInfo info = new TabInfo(_tag, _class, _args); 
      Stack<TabInfo> tabStack = mTabStackMap.get(_tag); 

      Fragment frag = fm.findFragmentByTag("android:switcher:" + mViewPager.getId() + ":" + mTabTags.indexOf(_tag)); 
      if(frag instanceof SaveStateBundle){ 
       Bundle b = new Bundle(); 
       ((SaveStateBundle) frag).onRemoveFragment(b); 
       tabStack.peek().setArgs(b); 
      } 
      tabStack.add(info); 

      FragmentTransaction ft = fm.beginTransaction(); 

      ft.remove(frag); 

      ft.addToBackStack(null); 

      ft.commit(); 

      notifyDataSetChanged(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

    public boolean popFragment(FragmentManager fm, String _tag){ 
     Stack<TabInfo> tabStack = mTabStackMap.get(_tag); 
     if(tabStack.size()>1){ 
      tabStack.pop(); 
      Fragment frag = fm.findFragmentByTag("android:switcher:" + mViewPager.getId() + ":" + mTabTags.indexOf(_tag)); 

      FragmentTransaction ft = fm.beginTransaction(); 

      ft.remove(frag); 

      ft.addToBackStack(null); 

      ft.commit(); 

      notifyDataSetChanged(); 

      return true; 
     } 
     return false; 
    } 

    public boolean back(FragmentManager fm) { 
     int position = mViewPager.getCurrentItem(); 
     return popFragment(fm, mTabTags.get(position)); 
    } 

    @Override 
    public int getCount() { 
     return mTabStackMap.size(); 
    } 

    @Override 
    public void notifyDataSetChanged(){ 
     super.notifyDataSetChanged(); 
    } 

    private final ViewPager.OnPageChangeListener viewPagerChangeListener = new ViewPager.OnPageChangeListener(){ 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onPageSelected(int position) { 
      // TODO Auto-generated method stub 
      TabWidget widget = mTabHost.getTabWidget(); 
      int oldFocusability = widget.getDescendantFocusability(); 
      widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
      mTabHost.setCurrentTab(position); 
      widget.setDescendantFocusability(oldFocusability); 
     } 
    }; 

    private final TabHost.OnTabChangeListener tabChangeListener = new TabHost.OnTabChangeListener(){ 

     @Override 
     public void onTabChanged(String tabId) { 
      int pos = mTabHost.getCurrentTab(); 
      mViewPager.setCurrentItem(pos);   
     } 

    }; 
} 

TabContent.java

import android.content.Context; 
import android.view.View; 
import android.widget.TabHost.TabContentFactory; 

public class TabContent implements TabContentFactory{ 

    private final Context mContext; 

    public TabContent(Context context){ 
     mContext = context; 
    } 

    @Override 
    public View createTabContent(String tag) { 
     View v = new View(mContext); 
     v.setMinimumWidth(0); 
     v.setMinimumHeight(0);   
     return v; 
    } 
} 

TabInfo.java

012 3,516,
import android.os.Bundle; 
import android.support.v4.app.Fragment; 

public class TabInfo { 

    private String tag; 
    private Class<?> clss; 
    private Bundle args; 
    private Fragment fragment; 

    public TabInfo(String tag, Class<?> clazz, Bundle args) { 
     this.tag = tag; 
     this.clss = clazz; 
     this.args = args; 
    } 

    public void setTag(String tag){ 
     this.tag = tag; 
    } 

    public String getTag(){ 
     return this.tag; 
    } 

    public void setClazz(Class<?> clzz){ 
     this.clss = clzz; 
    } 

    public Class<?> getClazz(){ 
     return this.clss; 
    } 

    public void setArgs(Bundle args){ 
     this.args = args; 
    } 

    public Bundle getArgs(){ 
     return this.args; 
    } 

    public Fragment getFragment(){ 
     return this.fragment; 
    } 

} 

import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class FragmentHome extends Fragment{ 

    Button button1; 
    View view; 

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

     if(container == null){ 
      return null; 
     } 

     this.view = inflater.inflate(R.layout.home, container, false); 

     this.setItens(); 

     return this.view; 
    } 

    private void setItens(){ 

     button1 = (Button)this.view.findViewById(R.id.button1); 
     button1.setOnClickListener(button1OnClickListener); 
    } 

    private final View.OnClickListener button1OnClickListener = new View.OnClickListener(){ 

     public void onClick(View v) { 
      showFragmentGraphics(); 
     } 
    }; 

    public void showFragmentGraphics(){ 
     //the code for replace fragment home 
    } 

} 

매니페스트 FragmentHome.java

이제
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="br.com.my.app" 
    android:versionCode="1" 
    android:versionName="1.0.0" 
    android:installLocation="internalOnly"> 

    <uses-sdk 
     android:minSdkVersion="7" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".ActivityMain" 
      android:screenOrientation="portrait" 
      android:configChanges="keyboardHidden|orientation"> 
      <intent-filter android:label="@string/app_name"> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity>   

    </application> 

</manifest> 

, 첫 번째 질문에 대한 오류 로그

04-30 18:56:19.591: E/AndroidRuntime(1275): FATAL EXCEPTION: main 
04-30 18:56:19.591: E/AndroidRuntime(1275): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.my.app/br.com.my.app.ActivityMain}: java.lang.NullPointerException 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.os.Looper.loop(Looper.java:123) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at dalvik.system.NativeStart.main(Native Method) 
04-30 18:56:19.591: E/AndroidRuntime(1275): Caused by: java.lang.NullPointerException 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:651) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.Activity.performStart(Activity.java:3791) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1620) 
04-30 18:56:19.591: E/AndroidRuntime(1275):  ... 11 more 

답변

0

, 당신은

에서 변경 시도 할 수 있습니다3210
this.mTabHost = (TabHost)findViewById(android.R.id.tabhost); 

번째 질문에 대한

this.mTabHost = (TabHost)findViewById(R.id.tabhost); 

, 당신은 Replace Fragment inside a ViewPager를 확인할 수 있습니다.

솔직히 말해서 코드와 디자인이 상당히 혼란 스럽습니다. ViewPager와 Tab에 대해 읽는 동안 시간을 ​​할애해야합니다.

+0

도 마찬가지이다. 나는 정확하게 두 번째 질문에 인용 한 페이지에있는 예를 따랐다. 내가 한 것은 직원이 내부적으로 (정적 클래스) 두는 클래스를 FragmentPagerAdapter에 분리하는 것이 었습니다. 만. 문제는 없습니다. 문제가 생겼습니다. 아직 해결 방법을 연구 중입니다. – Ludiaz

+0

@ 루디 아스 내가 혼란스러워하는 부분은 "사용자가 버튼을 다시 누르면 FragmentHome이 다시 표시됩니다."입니다. 같은 탭에 2 개의 조각이 있습니까? – pt2121

+0

어쨌든 첫 번째 부분을 이미 고쳤다는 이야기를 듣는 것이 좋습니다. – pt2121

관련 문제