如何实现Android Fragment Transaction .add 语法错误
Posted
技术标签:
【中文标题】如何实现Android Fragment Transaction .add 语法错误【英文标题】:How to implement Android Fragment Transaction .add syntax error 【发布时间】:2013-05-20 05:46:39 【问题描述】:我想让我的 android 应用程序使用 Fragment Transactions,这样我就可以 在各个 Fragment 之间切换显示它们的关联列表。我的应用程序 在尝试转换为片段事务之前工作正常。在我最初的 activity_main.xml 中, 我删除了 android:name="com.birdsall.peter.chap.ChapterFragment",我的理解是你不能使用 xml 定义的片段 使用片段交易。
1) 我似乎无法在其中获取 .add() getSupportFragmentManager 的参数正确,即使使用工作示例中的代码也是如此。 我也尝试使用较新版本的 FragmentTransactions 无济于事。 我什至举了一个使用 getSupportFragmentManager / FragmentTransactions 的代码示例, 修改为使用我的名字,它有效。然后我将该代码导入我的应用程序 它在 .add() 语法上失败。我对 Android 开发有点陌生,不能 指出我哪里出错了。
这是 FrameLayout 的主要 xml 布局
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<FrameLayout
android:id="@+id/fragment_container"
android:layout_
android:layout_
android:layout_weight="1" />
<fragment
android:id="@+id/chapterfragments"
android:layout_
android:layout_ />
<!-- Removed this from above <fragment> block to enable Fragment Transaction
android:name="com.birdsall.peter.chap.ChapterFragment" -->
</LinearLayout>
这是 ChapterFragment ListView 的 xml 布局
章节片段.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_ >
<ListView android:id="@+id/chapterlist" android:layout_
android:layout_ android:layout_alignParentLeft="true" />
</RelativeLayout>
这是列表详细信息的布局 章节信息.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_
android:orientation="vertical" android:padding="6dip">
<TextView android:id="@+id/chapter1" android:layout_
android:layout_ android:layout_alignParentTop="true"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView android:id="@+id/textViewLiteral" android:layout_
android:layout_ android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/chapter1" android:text=" - "
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView android:id="@+id/chaptertitle1" android:layout_
android:layout_ android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textViewLiteral"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
这是我修改的MainActivity.java。我离开了'setContentView(R.layout.activity_main);'因为我认为我需要创建一个视图(即使它是空的)来添加片段视图。
package com.birdsall.peter.chap;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
public class MainActivity extends FragmentActivity implements ChapterFragment.ChapterSelectedListener
private static final String TAG = "Main_Activity";
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting ...");
setContentView(R.layout.activity_main);
if (findViewById(R.id.fragment_container) != null)
if (savedInstanceState != null)
return;
// Create an instance of ExampleFragment
ChapterFragment firstFragment = new ChapterFragment();
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
**.add**(R.id.fragment_container, firstFragment).commit();
Log.i(TAG, "Ending ...");
...
这是我的 ChapterFragment.java
package com.birdsall.peter.chap;
import android.app.Activity;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class ChapterFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>
ChapterSelectedListener mCallback;
// Container Activity must implement this interface
public interface ChapterSelectedListener
public void onChapterSelected(String position, int rowId);
public SimpleCursorAdapter dataAdapter;
private static final String TAG = "ChapterFragment";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
View listview = inflater.inflate(R.layout.activity_main,null);
ListView mList =(ListView)listview.findViewById(R.id.chapterlist);
// The desired columns to be bound
String[] columns = new String[]
TDAdb.COL_CHAPTER,
TDAdb.COL_CHAPTERTITLE;
// the XML defined views which the data will be bound to
int[] to = new int[]
R.id.chapter1,
R.id.chaptertitle1,
;
// create an adapter from the SimpleCursorAdapter
dataAdapter = new SimpleCursorAdapter(
getActivity(),
R.layout.chapter_info,
null,
columns,
to,
0);
mList.setAdapter(dataAdapter);
//Ensures a loader is initialized and active.
getLoaderManager().initLoader(0, null, this);
return listview;
@Override
public void onStart()
super.onStart();
Log.i(TAG, " onStart");
displayListView();
Log.i(TAG, " end of onStart");
@Override
public void onAttach(Activity activity)
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try
mCallback = (ChapterSelectedListener) activity;
catch (ClassCastException e)
throw new ClassCastException(activity.toString()
+ " must implement ChapterSelectedListener");
@Override
public void onResume()
super.onResume();
//Starts a new or restarts an existing Loader in this manager
Log.i(TAG, " onResume");
getLoaderManager().restartLoader(0, null, this);
private void displayListView()
Log.i(TAG, " Starting displayListView");
// The desired columns to be bound
String[] columns = new String[]
TDAdb.COL_CHAPTER,
TDAdb.COL_CHAPTERTITLE;
// the XML defined views which the data will be bound to
int[] to = new int[]
R.id.chapter1,
R.id.chaptertitle1,
;
// create an adapter from the SimpleCursorAdapter
dataAdapter = new SimpleCursorAdapter(
getActivity(),
R.layout.chapter_info,
null,
columns,
to,
0);
// get reference to the ListView
ListView listView = (ListView) getView().findViewById(R.id.chapterlist);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
//Ensures a loader is initialized and active.
getLoaderManager().initLoader(0, null, this);
listView.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> listView, View view,
int position, long id)
// Get the cursor, positioned to the corresponding row in the result set
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
String chaptervalueselected =
cursor.getString(cursor.getColumnIndexOrThrow(TDAdb.COL_CHAPTER));
mCallback.onChapterSelected(chaptervalueselected, position);
Toast.makeText(getActivity(), "Chapter " + chaptervalueselected, Toast.LENGTH_SHORT).show();
// starts a new Intent to update/delete a Chapter
// pass in row Id to create the Content URI for a single row
//Intent chapterEdit = new Intent(getBaseContext(), ChapterEdit.class);
//Bundle bundle = new Bundle();
//bundle.putString("mode", "update");
//bundle.putString("rowId", rowId);
//chapterEdit.putExtras(bundle);
//startActivity(chapterEdit);
);
// This is called when a new Loader needs to be created.
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args)
Log.i(TAG, " onCreateLoader");
String[] projection =
TDAdb.KEY_ROWID,
TDAdb.COL_CHAPTER,
TDAdb.COL_CHAPTERTITLE;
CursorLoader cursorLoader = new CursorLoader(getActivity(),
TDAProvider.CONTENT_URI, projection, null, null, null);
return cursorLoader;
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data)
Log.i(TAG, " ononLoadFinished");
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
dataAdapter.swapCursor(data);
@Override
public void onLoaderReset(Loader<Cursor> loader)
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
Log.i(TAG, " onLoaderReset");
dataAdapter.swapCursor(null);
【问题讨论】:
【参考方案1】:如果您已经在使用FragmentTransaction
的add
方法,则不得在布局中包含<fragment
标记。如果你像这样离开你的主要活动 XML 怎么办:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_
android:layout_/>
【讨论】:
你能粘贴你的 logcat 输出吗?【参考方案2】:在 chapterFragment.java 中更改你的导入
import android.app.Fragment
到
import android.support.v4.app.Fragment
【讨论】:
以上是关于如何实现Android Fragment Transaction .add 语法错误的主要内容,如果未能解决你的问题,请参考以下文章
android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象
Android自学日记Android Fragment 真正的完全解析(上)
Android Fragment - 如何获得“mWho”值?