0

2013年1月16日編集:問題は解決しました!2日前に、アプリの更新バージョンをリリースし、を使用して、元々行っていたものを正しく識別しました。しかし、実際には、スローされた例外は誤解を招くものであり、それは実際の問題とは何の関係もありませんでした...ListViewsandroid:id="@android:id/list

ListFragment本当の修正は、ショーンがビューを膨らませることについての提案を実装したときに来nullました。ViewGroup。新しいバージョンから同じ例外を受け取っていません。新しいバージョンは、この問題が解決されたと安全に言うのに十分なデバイスによってダウンロードされています。しかし、私はローレンスによるコメントと回答に本当に感謝しており、彼がフラグメントをどのようにインスタンス化しているかについて読み続けます。彼はビューインフレーターにヌルを渡すことを提案しましたが、実際にはショーンが最初にそうしました。彼の解決策で問題が解決したようであるため、それに応じて賞金が授与されます。ローレンスの優れた回答によって示唆されているように、フラグメントをインスタンス化するさまざまな方法についてさらに学習/読んだ場合は、将来このスレッドを更新します。残念ながら、バウンティを分割することはできません!

2013年1月14日編集:@LawrenceChoy のリクエストにより、ListView関連XMLファイルはhttp://pastebin.com/2xnG1VfFにあります。

2013年1月13日編集: アプリの更新バージョンをリリースし、 Bishanの提案のandroid:id="@+id/android:list代わりに使用しましたが、そのアクティビティにがない場合でもandroid:id="@android:id/list"、フラグメントアクティビティにないランダムな例外が発生します。LGE電話からの別の例外を追加しました。a ListView whose id attribute is 'android.R.id.list'ListViews

2013年1月9日編集: Bishanが答えを提供しましたが、彼の解決策がこの例外を防ぐ理由についてもう少し説明を期待していました。さらに読んだ後、カスタムListViewを使用する場合は+記号を使用する必要があるためだと思います。ただし、特に両方が多くの異なるデバイスとエミュレーターで機能しているように見えることを考えると、私が正しいことを確認したり、説明を求めたりしたいと思います。この問題に関する信頼できる情報源/回答を探すために、約20分で賞金を調達します。ありがとう。


Playストアへの最近の更新されたリリースの後、実際にいくつかのデバイスから非常に奇妙な動作が発生しています。

私の新しいリリースでは、を使用していくつかのフラグメントを管理するFragmentActivity(TabsStyledと呼ばれる)があります。FragmentStatePagerAdapter私は合計4つのフラグメントを持っており、それらのフラグメントのうち2つは拡張されており、リストビューにはすべてライブラリからのとListFragmentが入力されています。他の2つのフラグメントには、がなく、拡張されていません。LoaderManagerCursorLoadersupport.v4ListViewsListFragment

AVDだけでなく複数のデバイスで広範なテストを行いましたが、android.R.id.listが見つからないためにRuntimeExceptionsが発生することはありませんでした。

ただし、リリース時に、FragmentAcitivtyでいくつかのACRAクラッシュが発生しました"Your content must have a ListView whose id attribute is 'android.R.id.list'"。TabsStyled.classは、FragmentActivityListFragmentsを管理するものであり、それ自体には`ListViews'はありません。これは私には非常に奇妙に思えます。この例外がスローされた場合、「親」のFragmentActivityではなく、ListFragmentsの1つに対するものであると思うからです。

これがスタックトレースの最上位です。ここにすべてを貼り付けるのではなく、要求に応じて追加のコードや情報を提供できます。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.hiddenforsecurity/com.myapp.hiddenforsecurity.TabsStyled}: 
java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

ここでpastebinで利用可能な完全なスタックトレース:http://pastebin.com/aiV7pwXP

ListFragmentsListViewsを含むそれぞれのXML (ListViewそれぞれの個別のXMLに個別ListFragment):

<ListView android:id="@android:id/list" 
    <!--the release currently uses "@+id/android:list)-->
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="45" />

ListFragmentsペーストビンにアップロードされた(診断を容易にするために少し簡略化された)1つ(他のListFragmentは非常に似ています):http: //pastebin.com/Nts3nVx1

そして、TabsStyledのわずかに簡略化されたフルバージョン(FragmentActivity):http: //pastebin.com/ZS4Xg8kP

これまでに例外を作成したデバイス(および1/14の時点で、クラッシュを投稿し続けています):

MODEL       BRAND    ANDROID API
GT-I9305    Samsung  4.1.1 (using @android:id/list)
GT-S7562    Samsung  4.0.4 (using @android:id/list)
GalaxyNexus Samsung  4.2.1 (same exception seen with @+id/android:list)
L-01E       LGE      4.0.4 (same exception seen with @+id/android:list)
4

5 に答える 5

5

ちょっとしたことですが、ViewGroupを使用せずに、ListFragmentのカスタムビューを膨らませてみてください。したがって、ListFragmentの変更で

View logv = inflater.inflate(R.layout.listroot, container, false);

View logv = inflater.inflate(R.layout.listroot, null);
于 2013-01-14T17:32:43.817 に答える
2

上記のデバイスがないため、提供されたコードで問題を再現できませんでした。私の最初の考えは、フラグメントを初期化する方法と関係があるかもしれないということです。以下の私の変更されたnFragmentAdapterクラスを参照してください。getItem()別の方法でフラグメントを初期化するように変更しました。

nFragmentAdapter:

class nFragmentAdapter extends FragmentStatePagerAdapter {

        public nFragmentAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override        
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public Fragment getItem(int position) {

            Fragment f = null;
            Bundle args = new Bundle();
            args.putString("content", TabsStyled.CONTENT[position
                    % TabsStyled.CONTENT.length]);
            switch (position) {
            case 0:
                f = Fragment.instantiate(TabsStyled.this,
                        ReviewFragment.class.getName(), args);
                break;
            case 1:
                f = Fragment.instantiate(TabsStyled.this,
                        MyListFragment.class.getName(), args);
                break;
            case 2:
                f = Fragment.instantiate(TabsStyled.this,
                        SmartFragment.class.getName(), args);
                break;
            case 3:
                f = Fragment.instantiate(TabsStyled.this,
                        MyListFragment.class.getName(), args);
                break;
            case 4:
                f = Fragment.instantiate(TabsStyled.this,
                        f.getClass.getName(), args);
                break;
            case 5:
                f = Fragment.instantiate(TabsStyled.this,
                        f.getClass.getName(), args);
                break;
            case 6:
                f = Fragment.instantiate(TabsStyled.this,
                        f.getClass.getName(), args);
                break;
            }
            return f;
        }

        @Override
        public int getCount() {
            return TabsStyled.CONTENT.length;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return TabsStyled.CONTENT[position % TabsStyled.CONTENT.length].toUpperCase();
        }
    }

そして対応するMyListFragment:

public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

        myCursorAdapter mAdapter;
        String orderBy = DBAdapter.activityDateTime + " DESC";

        static final String[] activityQuery = new String[] { DBAdapter.activityRowID, DBAdapter.activityReason, DBAdapter.activityDateTime };

        String content;

    public void refreshView() {
        getLoaderManager().restartLoader(0, null, this);
    }

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                Bundle args = getArguments();
                if(args != null)
                    content = args.getString("content");
                View logv = inflater.inflate(R.layout.listroot, null);
                return logv;           
        }      

        @Override
    public void onActivityCreated(Bundle savedInstanceState) {
                  super.onActivityCreated(savedInstanceState);
                mAdapter = new myCursorAdapter(getActivity(), null);
                setListAdapter(mAdapter);              
                getLoaderManager().initLoader(0, null, this);
        }

        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
        }

        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
                return new CursorLoader(getActivity().getApplicationContext(), myListProvider.activity_URI, activityQuery, null, null, orderBy);
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
                mAdapter.swapCursor(data);             
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
                mAdapter.swapCursor(null);     
        }

    public class myCursorAdapter extends CursorAdapter {

        private final LayoutInflater mInflater;

        public myCursorAdapter(Context context, Cursor c) {
                super(context, c, 0);
                mInflater = LayoutInflater.from(context);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            TextView logleft = (TextView) view.findViewById(R.id.logleft);
                        logleft.setText(cursor.getString(cursor.getColumnIndex(DBAdapter.activityDateTime)));

            TextView logcenter = (TextView) view.findViewById(R.id.logcenter);
            logcenter.setText(cursor.getString(cursor.getColumnIndex(DBAdapter.activityReason)));

        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
                View view = null;
                view = mInflater.inflate(R.layout.vlist, parent, false);
            return view;
        }
    }

}

これが何かを変更する場合は、私に更新してください。

于 2013-01-15T04:05:02.753 に答える
0

ListView内でandroid:id = "@ + id/list"を使用しないでください。もう1つのオプション、つまりandroid:id = "@ id / android:list"を使用してIDを作成するか、android:id = "@ + id/list1"を使用できます。

于 2013-01-15T04:45:30.240 に答える
0

これを試して。

<ListView android:id="@+id/android:list"
    android:choiceMode="singleChoice" 
    android:paddingTop="4dp" 
    android:paddingBottom="4dp" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="45" />

に置き換えandroid:id="@android:id/list" ましたandroid:id="@+id/android:list"

于 2013-01-08T04:24:41.910 に答える
0

投稿ありがとうございます。私はAndroidプログラミングを始めたばかりなので、これに少し苦労していました。それを変更してandroid:id="@android:id/list"、私のためにトリックを行いました。

ListViewの中に表示したものが1つしかないサンプルプログラムを書いたばかりですが、ListFramgmentこの投稿を読んだ後、ようやく動作させることができました。次に、文字列の配列を表示する代わりに、リストにカスタムオブジェクト(たとえば、1行にテキストとアイコンで構成される)を表示できるかどうかを試してみます。

どうもありがとう!

于 2013-05-12T21:33:59.983 に答える