0

私は 2 つのアクティビティ (MainActivity と WelcomeActividy) を持つアプリケーションを持っています。android.support.v4.app.FragmentActivity

WelcomeActivity は表示フラグメント (Step1、Step2、...、StepN) に ViewFlipper を使用します 1 つのステップでフラグメント リスト (CategoryStarredFragment) を使用します WelcomeActivity は問題ありません

MainActivity は表示フラグメントにタブホストを使用しますが、すべて正常に動作しますが、同じ CategoryStarredFragment を含めようとすると (WelcomeActivity で正常に動作します)、例外が発生します

04-11 15:32:28.197: E/AndroidRuntime(16124): Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.package.apk]

問題を引き起こしているタブホストの実装だと思います

ここですMainActivity.java

public class MainActivity extends FragmentActivity implements OnTabChangeListener {


    private TabHost mTabHost;

    private SparseArray<Class<?>> mSparseFragments = new SparseArray<Class<?>>(){{
        put(R.id.tab_home, HomeFragment.class);
                // other tabs
        put(R.id.tab_settings, SettingsFragment.class);
    }};

    private SparseArray<String> mSparseTags = new SparseArray<String>(){{
        put(R.id.tab_home, "home");
                // other tabs
        put(R.id.tab_settings, "settings");
    }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initTabs();         
    }

    private void initTabs() {
        mTabHost = (TabHost)findViewById(android.R.id.tabhost);
        mTabHost.setup();
        mTabHost.setOnTabChangedListener(this);

        mTabHost.addTab(buildTabSpec("home", R.string.title_tab_home, R.layout.regular_home_fragment));
                // other tabs
        mTabHost.addTab(buildTabSpec("settings", R.string.title_tab_settings, R.layout.regular_settings_fragment));
    }
    @Override
    public void onTabChanged(String tabId) {        
        Log.i(TAG, "Tab changed to: " + tabId);

        final FragmentManager fm = getSupportFragmentManager();
        final FragmentTransaction ft = fm.beginTransaction();
        Fragment fragment;
        int current = 0;


        for (int i = R.id.tab_home; i <= R.id.tab_settings; i++) {              
            if(mSparseTags.get(i).equals(tabId)) {
                current = i;
            } else if(null != (fragment = fm.findFragmentByTag(mSparseTags.get(i)))) {
                ft.detach(fragment);
            }
        }


        if(null == (fragment = fm.findFragmentByTag(tabId))) {
            try {
                ft.add(current, (Fragment) mSparseFragments.get(current).newInstance(), tabId);             
            } catch (InstantiationException e) {        
                e.printStackTrace();
            } catch (IllegalAccessException e) {        
                e.printStackTrace();
            }
        } else {
            ft.attach(fragment);
        }

        ft.commit();
    }

    private TabSpec buildTabSpec(String tag, int labelId, int viewId) {     
        final View indicator = LayoutInflater.from(getApplicationContext())
                .inflate(R.layout.tab, (ViewGroup) findViewById(android.R.id.tabs), false);
        ((TextView)indicator.findViewById(R.id.text)).setText(labelId);
        return mTabHost.newTabSpec(tag)
                .setIndicator(indicator)
                .setContent(new TabContent(getApplicationContext(), viewId));
    }

    public class TabContent implements TabContentFactory {

        private Context mContext;
        private int mViewId;

        public TabContent(Context context, int viewId) {
            mContext = context;
            mViewId = viewId;
        }

        @Override
        public View createTabContent(String tag) {
            Log.i(TAG, "Inflation tab content " + tag);
            View view = LayoutInflater.from(mContext).inflate(mViewId, null);           
            return view;
        }

    }   

}

これが MainActivity レイアウトです

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TabHost
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@android:id/tabhost">

        <LinearLayout
            android:orientation="vertical"
            android:layout_height="fill_parent"
            android:layout_width="fill_parent">

            <TabWidget 
                android:id="@android:id/tabs"            
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/ab_stacked_solid_mainbar">            
            </TabWidget>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent">             
                <FrameLayout
                    android:id="@+id/tab_home"
                    android:layout_height="fill_parent"
                    android:layout_width="fill_parent"/>
                <!-- Other tabs --> 
                <FrameLayout 
                    android:id="@+id/tab_settings"
                    android:layout_height="fill_parent"
                    android:layout_width="fill_parent"/>            
             </FrameLayout>

        </LinearLayout>
    </TabHost>
</RelativeLayout>

ここにレイアウトの最初のタブがあります

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >    

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/title_tab_home"
        android:textSize="64sp"/>

    <fragment
            android:id="@+id/category_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_marginTop="18dp"
            class="com.package.CategoryStarredFragment" />

</LinearLayout>
4

2 に答える 2

8

タグを含むレイアウトを<fragment>、API レベル 10 以下のデバイスで、Activityではなくから読み込もうとしていますFragmentActivity

実際には、この場合はもう少し微妙です。を使用しようとしていますLayoutInflater.from()。これは問題ありませんが、API レベル 10 以下のデバイスでは、<fragment>タグが含まれているレイアウト リソース ファイルを解釈するために使用するLayoutInflaterことはできません<fragment>。タグを解釈するには、 で返さLayoutInflaterれるインスタンスを使用する必要があります。getLayoutInflater()FragmentActivity<fragment>

于 2013-04-11T20:47:36.870 に答える
1

私がクリーンアップしているプロジェクトで同じ問題が発生しました (ご存知のように、アプリケーションにアイデアを追加し始めることがありますが、それらの多くは最後まで生き残ることができず、グリースを消去して機能を回避する方がはるかに優れています。セキュリティの問題...目の前に森がなければ、よりよく見ることができます)。

問題を数時間見てから、別の場所で修正し、元の状況に戻りました。実際、解決策は非常に単純です (いつものように、クリーンなコーディング プラクティスに関連しています)。

(1) 正しい FragmentActivity をインポートしていることを 100% 確認してください。

import android.support.v4.app.FragmentActivity;

(2) Activity が FragmentActivity から拡張されていることを確認します

(3) Fragment が正しい android.support.v4.app... Fragment からも拡張されていることを確認します。

(4)それだけです...通常のコードが機能する必要があります

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

    View vFragmentView = inflater.inflate(R.layout.my_fragment, container);
    return vFragmentView;
}

// other stuff

Samsung Galaxy Fit (2.3.4) と Kindle Fire HD (4.0) でテスト済み。

于 2013-07-15T14:55:43.743 に答える