1

私は、を含むActivityいくつかのデータを取得して表示する必要がある単純なものを書いています。問題は、どのメソッドも呼び出されていないように見えるため、アクセスできないことです。FragmentListViewListViewon*

フラグメントには、LinearLayoutのコードによって動的に入力されるがありますonCreateView。はinをActivity作成し、 returned byを使用してレイアウトに追加します(補足:私はsupport-v4ライブラリを使用しています)。FragmentonCreateFragmentManagergetSupportFragmentManager

//メソッドにいくつかのLog.d呼び出しを追加すると、それらのいずれも呼び出されていないことが明確に示されます。onAttachonCreateonCreateView

私は何が間違っているのですか?

アクティビティ:

public class CharactersActivity extends FragmentActivity {

    private MainCharactersFragment mainFragment = null;

    private String[] charnames = null;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // R.layout.characters contains only a LinearLayout with id characters_fragment_container
        setContentView(R.layout.characters);
        if (mainFragment == null) {
            mainFragment = new MainCharactersFragment();
            //Add the fragment to the activity's layout.
            //Taken from Google's tutorials.
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.characters_fragment_container, mainFragment).commit();
            //I'd expect onCreateView to be called during this commit, but it is not called.
        }
        //Loads some data to display
        Intent intent = getIntent();
        String[] filenames = intent.getStringArrayExtra(PortableDnDActivity.CHARACTERS_FILENAMES);
        this.charnames = new String[filenames.length];
        for (int i=0; i < filenames.length; i++) {
            this.charnames[i] = getCharacterName(filenames[i]);
        }
    }

    @Override
    public void onStart() {
        // Set the ListAdapter to show the data.
        Log.d("MyLog", "           HERE            ");  // Shown by logs
        ListView view = (ListView) findViewById(R.id.main_characters_view); // This is null
        Log.d("MyLog", "The view is null:" + (view == null));
        mainFragment.setCharsAdapter(this, this.charnames);
        Log.d("MyLog", "                 HERE           2222"); //NOT shown by the logs
    }

アクティビティのレイアウト:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/characters_fragment_container"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
</LinearLayout>

フラグメント:

public class MainCharactersFragment extends Fragment {

    public ListView charsList;
    public Button newCharButton;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // The following is never shown in the logs
        Log.d("MyLog", "                HERE                ");
        View view = inflater.inflate(R.layout.main_characters_fragment, container, false);
        return view;
    }

    public void setCharsAdapter(Context ctx, String[] data) {
        // Raise NullPointerException because at this moment
        // findViewById(R.id.main_characters_view) returns null
        charsList.setAdapter(new ArrayAdapter<String>(ctx, R.id.main_characters_view, data));
    }
    @Override
    public void onAttach(Activity activity) {
        Log.d("MyLog", "            onAttach called           "); //Never shown
    }
}

フラグメントレイアウト:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView android:id="@+id/main_characters_view"
              android:layout_width="fill_parent"
              android:layout_height="0dp"
              android:layout_weight="0.5"
              />
    <Button android:id="@+id/new_character_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/new_character"
            />

</LinearLayout>
4

1 に答える 1

2

NPEは物事を混乱させていると思います。onStart()個別に対処できるように、コメントしてください。

これを行うと、メソッドを呼び出すために転倒するケースがいくつかあることがわかりますsuper。一度MainCharactersFragment.onAttach()と一度CharactersActivity.onStart()。これらの2つの呼び出しを追加し、クリーンアップして、再試行してください。

これらの変更を考えると、あなたのコードは私にとってはうまくいきました。

于 2013-01-16T17:22:47.263 に答える