1

2 つのタブを持つフラグメントがあり、各タブにはそれぞれのフラグメントがあります。各タブには、サーバーからロードされる独自のリストがあります。しかし、私のアプリは次のような例外に遭遇しました

java.lang.RuntimeException: アクティビティを開始できません ComponentInfo{com.oj.bs/com.oj.bs.ProjectFragActivity}: java.lang.IllegalStateException: コンテンツ ビューがまだ作成されていません

どこに問題があるのか​​ 理解できません。誰が私が間違っているのか教えてもらえますか?

以下は私のフラグメントクラスです

public class ResidentialFragActivity extends SherlockListFragment implements ActionBar.TabListener{

ListView listview;
ListView resListviewId;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setContentView(R.layout.residential_list);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle saved) {

    View view = inflater.inflate(R.layout.residential_list,container, false);
    resListviewId = (ListView)view.findViewById(R.id.resProjListView);
    projectList = new ArrayList<HashMap<String,String>>();
    new LoadProjects().execute();

    ListView listview = getListView();
    listview.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            Intent href = new Intent(getSherlockActivity(), ProjectDetailActivity.class);

                    String proj_id = ((TextView) view.findViewById(R.id.projectId)).getText().toString();  
                        href.putExtra("proj_id", proj_id);     
            getSherlockActivity().startActivity(href);
        }
    });
    if (container == null) {
        return null;
    }
    return view;
}

public void onStart() {
    super.onStart();
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.add(android.R.id.content,this,"residential");
    ft.attach(this);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.detach(this);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

//inner class for network operation
private class LoadProjects extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        ..........
        //get data from the latest server
        String jsonpProjList = ResdProj.makeHttpReqToSrvr(projectUrl, "POST", projRes);

        return null;
    }
    @Override
    protected void onPostExecute(String result) {

        getSherlockActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                ListAdapter projAdapter = new SimpleAdapter(getSherlockActivity(),
                        projectList, R.layout.residential_list_item, 
                        new String[] {PROJ_ID,PROJ_NAME}, new int[] 
                            {R.id.projectId,R.id.projectName});
                //updating the UI
                setListAdapter(projAdapter);
            }
        });
    }
}

事前に感謝します

4

3 に答える 3

1

まず第一に、あなたのコードには多くの「悪い点」が見られます。私が決してやらない最初のことは、それがうまくいくかどうか本当に確信が持てないgetActivity().setContentView(R.layout.residential_list);. Fragmentsxml を使用して FragmentActivity に追加するか、 FrameLayout. このFragmentsFragmentsを実現するベスト プラクティスについては、Android の例を確認してください。

もう 1 つは、UI スレッドで既に実行されているため、これrunOnUiThreadを で使用する必要がないことです。onPostExecute()

最後に、最初にコンテンツを に設定しFragmentActivity、タブを追加して、ActionBar最初/2番目のタブにフラグメントを添付します。その後、 をListView使用して にデータを適切に入力できますAsyncTask

于 2013-04-29T09:02:28.407 に答える
0

したがって、フラグメントのビューを作成できるクレイジーな世界に住んでいることを覚えておく必要があります。それは、それを含むアクティビティから切り離されているため、フラグメントのビューは準備ができていますが、画面には表示されず、「コンテンツビューはまだありません」作成した"。

onActivityCreatedフラグメントに実装して呼び出したいと思うでしょう

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    new LoadProjects().execute();
}

そこから。

これにより、フラグメントとアクティビティの両方が確実に作成されます。しかし、待ってください。また、 でアクティビティを終了することができ、フラグメントがまだ存在している可能性があることも忘れないでくださいactivity.startActivity(...)(切り離されている可能性があります)。その場合、onActivityCreatedアクティビティが再開され、フラグメントが再アタッチされると、 が再度呼び出されます。そのため、今よりも頻繁に呼び出される可能性があります。

いつ実際にそれをトリガーするかについてのビジネス ロジックについては、あなたに任せます。または、アクティビティを終了した場合、そのコンテンツをリロードしても問題ないかもしれません。幸運を祈ります。

于 2014-02-05T20:53:04.513 に答える