java - 在 Android 应用程序中设置和打开 fragment 的问题

标签 java android android-fragments

我遇到了问题,因为我的应用程序崩溃了而不是打开 fragment 。我有一个 ListActivity,它将带您到另一个 Activity ;在另一项 Activity 中,有两个 fragment 。 ListActivity 期待来自其中一个 fragment 的结果。

我的代码在添加 fragment 之前就可以运行!然而, fragment 不再显示,应用程序关闭...有人知道我的问题可能是什么吗?关于如何处理这个问题有什么建议吗?我真诚地感谢所有的帮助,谢谢!我的代码如下。

ListActivity.java:

public class LyricList extends ListActivity {
private static final int ACTIVITY_CREATE=0;
private static final int ACTIVITY_EDIT=1;
private static final int INSERT_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;
private LyricsDbAdapter mDbHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lyriclist);
    mDbHelper = new LyricsDbAdapter(this);
    mDbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}

private void fillData() {
    Cursor lyricsCursor = mDbHelper.fetchAllLyrics();
    startManagingCursor(lyricsCursor);
    String[] from = new String[]{LyricsDbAdapter.KEY_TITLE};
    int[] to = new int[]{R.id.text1};
    SimpleCursorAdapter lyrics = 
        new SimpleCursorAdapter(this, R.layout.lyrics_row, lyricsCursor, from, to);
    setListAdapter(lyrics);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(0, INSERT_ID, 0, R.string.menu_insert);
    return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
        case INSERT_ID:
            createLyric();
            return true;
    }

    return super.onMenuItemSelected(featureId, item);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case DELETE_ID:
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            mDbHelper.deleteLyric(info.id);
            fillData();
            return true;
    }
    return super.onContextItemSelected(item);
}

private void createLyric() {
    Intent i = new Intent(this, NextActivity.class);
    startActivityForResult(i, ACTIVITY_CREATE);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Intent i = new Intent(this, NextActivity.class);
    i.putExtra(LyricsDbAdapter.KEY_ROWID, id);
    startActivityForResult(i, ACTIVITY_EDIT);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    fillData();
}
}

应通过 listActivity 打开的其他 Activity 类:

public class NextActivity extends Activity {

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

    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    Tab one = actionBar.newTab().setText("Lyric Editor");
    Tab two = actionBar.newTab().setText("Loops");

    one.setTabListener(new MyTabListener(new LyricEditorFragment()));
    two.setTabListener(new MyTabListener(new LoopsFragment()));

    actionBar.addTab(one);
    actionBar.addTab(two);
}
public class MyTabListener implements TabListener{
    Fragment fragment;

    public MyTabListener(Fragment f){
        fragment = f;
    }
    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }
    @Override
    public void onTabSelected(Tab arg0, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        ft.replace(R.id.frame1, fragment);
    }
    @Override
    public void onTabUnselected(Tab arg0, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        ft.remove(fragment);
    }
}
    }

不确定您是否想查看 fragment 类,但这只是为了以防万一:

public class LyricEditorFragment extends Fragment {
private EditText mTitleText;
private EditText mBodyText;
private Long mRowId;
private LyricsDbAdapter mDbHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDbHelper = new LyricsDbAdapter(getActivity());
    mDbHelper.open();

    mTitleText = (EditText) getView().findViewById(R.id.title);
    mBodyText = (EditText) getView().findViewById(R.id.body);
    Button confirmButton = (Button) getView().findViewById(R.id.confirm);

    mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(LyricsDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getActivity().getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(LyricsDbAdapter.KEY_ROWID)
                                : null;
    }

    populateFields();

    confirmButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            getActivity().setResult(Activity.RESULT_OK);
            getActivity().finish();
        }

    });
}

private void populateFields() {
    if (mRowId != null) {
        Cursor lyric = mDbHelper.fetchLyric(mRowId);
        getActivity().startManagingCursor(lyric);
        mTitleText.setText(lyric.getString(
                lyric.getColumnIndexOrThrow(LyricsDbAdapter.KEY_TITLE)));
        mBodyText.setText(lyric.getString(
                lyric.getColumnIndexOrThrow(LyricsDbAdapter.KEY_BODY)));
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    saveState();
    outState.putSerializable(LyricsDbAdapter.KEY_ROWID, mRowId);
}

@Override
public void onPause() {
    super.onPause();
    saveState();
}

@Override
public void onResume() {
    super.onResume();
    populateFields();
}

private void saveState() {
    String title = mTitleText.getText().toString();
    String body = mBodyText.getText().toString();

    if (mRowId == null) {
        long id = mDbHelper.createLyric(title, body);
        if (id > 0) {
            mRowId = id;
        }
    } else {
        mDbHelper.updateLyric(mRowId, title, body);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    //return super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.activity_lyriceditor, container, false);
    return view;
}

    }

crashlog

最佳答案

问题是您从 Activity 中获取一个 View ,该 View 将返回 null..您需要从 onCreateView 创建/膨胀 View ..

单击此处并按照有关如何从 fragment 创建和使用 View 的步骤进行操作。

Click Here

关于java - 在 Android 应用程序中设置和打开 fragment 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301858/

相关文章:

java - Facebook 的 Android ProGuard 设置

java - 当我在 Android 上扩展应用程序时,上下文在 Glide 上不起作用

android - 如何从选项卡中的两个不同 fragment 获取数据到主要 Activity

android - 仅当 Fragment 在 ViewPager 中可见时才触发 RxJava 事件更改

java - 当从我的主类访问时,我的(正确的) HashMap 返回 null -(初学者)

java - 带 https 的 Spring web 和 tomcat

java - 加载JNI共享库失败 "C:\Program Files\Java\jdk1.7.0_40\bin\..\jre\bin\server\jvm.dll"

Java <-> C 桥

java - 如何在从 Java 对象解析的 json 数组中添加 Json header

android - VectorDrawable 未显示或绘制错误