好的,我有一个使用片段在操作栏中实现选项卡的应用程序。每个选项卡都有自己的视图,每个视图中都有按钮。我希望能够从这些按钮启动一个活动或另一个片段视图来执行各种其他操作。我正在尝试做的一个例子如下。我的主要活动如下所示:
public class MainActivity extends SherlockFragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowTitleEnabled(true);
bar.setTitle("Newalla Church of Christ");
bar.addTab(bar.newTab()
.setText("Home")
.setTabListener(new TabListener<HomeFragment>(
this, "Home", HomeFragment.class, null)));
bar.addTab(bar.newTab()
.setText("Feeds")
.setTabListener(new TabListener<FeedsFragment>(
this, "Feeds", FeedsFragment.class, null)));
bar.addTab(bar.newTab()
.setText("Leadership")
.setTabListener(new TabListener<LeadershipFragment>(
this, "Leadership", LeadershipFragment.class, null)));
bar.addTab(bar.newTab()
.setText("Bulletin")
.setTabListener(new TabListener<BulletinFragment>(
this, "Bulletin", BulletinFragment.class, null)));
bar.addTab(bar.newTab()
.setText("Directory")
.setTabListener(new TabListener<DirectoryFragment>(
this, "Directory", DirectoryFragment.class, null)));
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar()
.getSelectedNavigationIndex());
}
public class TabListener<T extends Fragment> implements
ActionBar.TabListener {
private final FragmentActivity mActivity;
private final String mTag;
private final Class<T> mClass;
private final Bundle mArgs;
private Fragment mFragment;
public TabListener(FragmentActivity activity, String tag, Class<T> clz,
Bundle args) {
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
FragmentTransaction ft = mActivity.getSupportFragmentManager()
.beginTransaction();
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
mFragment = mActivity.getSupportFragmentManager()
.findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
ft.detach(mFragment);
}
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft = mActivity.getSupportFragmentManager()
.beginTransaction();
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName(),
mArgs);
ft.add(android.R.id.content, mFragment, mTag);
ft.commit();
} else {
ft.attach(mFragment);
ft.commit();
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft = mActivity.getSupportFragmentManager()
.beginTransaction();
if (mFragment != null) {
ft.detach(mFragment);
ft.commitAllowingStateLoss();
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
其中一个标签是领导力。在此选项卡中,我需要从按钮加载三个不同的列表视图。这是我制作的列表视图和查看器的示例。
列出活动
public class EldersListActivity extends SherlockFragmentActivity implements EldersListFragment.ListItemSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
}
@Override
public void onListItemSelected(int index) {
EldersListFragment imageViewer = (EldersListFragment) getSupportFragmentManager()
.findFragmentById(R.id.viewer_fragment);
if (imageViewer == null || !imageViewer.isInLayout()) {
Intent showImage = new Intent(getApplicationContext(),
ViewerActivity.class);
showImage.putExtra("index", index);
startActivity(showImage);
}
}
}
列出片段
public class EldersListFragment extends SherlockListFragment{
private int index = 0;
private ListItemSelectedListener selectedListener;
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
index = position;
selectedListener.onListItemSelected(position);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(ArrayAdapter.createFromResource(getActivity(),
R.array.elders, android.R.layout.simple_list_item_1));
if (savedInstanceState != null) {
index = savedInstanceState.getInt("index", 0);
selectedListener.onListItemSelected(index);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("index", index);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
selectedListener = (ListItemSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ListItemSelectedListener in Activity");
}
}
public interface ListItemSelectedListener {
public void onListItemSelected(int index);
}
}
观众活动
public class ViewerActivity extends SherlockFragmentActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
finish();
return;
}
setContentView(R.layout.viewer_activity);
Intent launchingIntent = getIntent();
int index = launchingIntent.getIntExtra("index", 0);
ViewerFragment viewer = (ViewerFragment) getSupportFragmentManager()
.findFragmentById(R.id.viewer_fragment);
viewer.update(index);
}
}
查看器片段
public class ViewerFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.viewer_fragment, container, false);
}
public void update(int index) {
TextView title = (TextView) getView().findViewById(R.id.title);
ImageView image = (ImageView) getView().findViewById(R.id.image);
String[] imageTitles = getResources().getStringArray(R.array.elders);
String[] imageLocations = getResources().getStringArray(R.array.elder_images);
title.setText(imageTitles[index]);
InputStream is;
try {
is = getActivity().getAssets().open(imageLocations[index]);
Bitmap bitmap = BitmapFactory.decodeStream(is);
image.setImageBitmap(bitmap);
} catch (IOException e) {
Log.e("ViewerFragment", "Failed to decode image");
}
}
}
最后是视图中具有三个按钮的领导选项卡。每个按钮都需要调用不同的列表视图。这是这些的代码和xml文件。
领导碎片
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import com.actionbarsherlock.app.SherlockFragment;
public class LeadershipFragment extends SherlockFragment {
Button mButton8;
Button mButton9;
Button mButton10;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_leadership_layout, container, false);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//get the button view
mButton8 = (Button) getView().findViewById(R.id.button8);
//set a onclick listener for when the button gets clicked
mButton8.setOnClickListener(new OnClickListener() {
//Start new list activity
@Override
public void onClick(View v) {
Intent mainIntent = new Intent(getActivity(), EldersListActivity.class);
startActivity(mainIntent);
}
});
}
}
领导 XML 文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background" >
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="31dp"
android:src="@drawable/lead"
android:contentDescription="@string/lead"/>
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@drawable/ministers" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:layout_toRightOf="@+id/button8"
android:background="@drawable/deacons" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="30dp"
android:layout_toLeftOf="@+id/button8"
android:background="@drawable/elders" />
</RelativeLayout>
</LinearLayout>
LOG CAT 强制关闭
10-18 23:39:34.196: E/AndroidRuntime(9601): FATAL EXCEPTION: main
10-18 23:39:34.196: E/AndroidRuntime(9601): java.lang.NullPointerException
10-18 23:39:34.196: E/AndroidRuntime(9601): at com.threesixteenapps.newalla.LeadershipFragment.onCreate(LeadershipFragment.java:31)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:835)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.os.Handler.handleCallback(Handler.java:587)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.os.Handler.dispatchMessage(Handler.java:92)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.os.Looper.loop(Looper.java:150)
10-18 23:39:34.196: E/AndroidRuntime(9601): at android.app.ActivityThread.main(ActivityThread.java:4263)
10-18 23:39:34.196: E/AndroidRuntime(9601): at java.lang.reflect.Method.invokeNative(Native Method)
10-18 23:39:34.196: E/AndroidRuntime(9601): at java.lang.reflect.Method.invoke(Method.java:507)
10-18 23:39:34.196: E/AndroidRuntime(9601): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-18 23:39:34.196: E/AndroidRuntime(9601): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-18 23:39:34.196: E/AndroidRuntime(9601): at dalvik.system.NativeStart.main(Native Method)