3

好的,我有一个使用片段在操作栏中实现选项卡的应用程序。每个选项卡都有自己的视图,每个视图中都有按钮。我希望能够从这些按钮启动一个活动或另一个片段视图来执行各种其他操作。我正在尝试做的一个例子如下。我的主要活动如下所示:

 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)
4

1 回答 1

4

好吧,那应该很简单。我假设您的选项卡和选项卡片段都正常工作。您想要做的是从每个按钮启动一个新活动(而不是片段)。如果你想在标签片段旁边显示列表视图,你会使用片段,但是因为你想要一个新屏幕,所以你使用一个活动。

因此,在您的按钮 onClick Listener 中,您只需要创建一个新意图并启动它。下面是一些示例代码:

public class LeaderShipFragment extends Fragment {
Button mButton8;
Button mButton9;
Button mButton10;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.leadership_fragment, null);
    return root;
}


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

    //get the button view
    mButton8 = 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(), Button8ListActivity.class);
            startActivity(mainIntent);
        }
    });
    //get the button view
    mButton9 = getView().findViewById(R.id.button9);
    //set a onclick listener for when the button gets clicked
    mButton9.setOnClickListener(new OnClickListener() {
        //Start new list activity
        @Override
        public void onClick(View v) {
            Intent mainIntent = new Intent(getActivity(), Button9ListActivity.class);
            startActivity(mainIntent);
        }
    });
    //get the button view
    mButton10 = getView().findViewById(R.id.button10);
    //set a onclick listener for when the button gets clicked
    mButton10.setOnClickListener(new OnClickListener() {
        //Start new list activity
        @Override
        public void onClick(View v) {
            Intent mainIntent = new Intent(getActivity(), Button10ListActivity.class);
            startActivity(mainIntent);
        }
    });

}

}

希望那是你想要的。Android 将处理所有的 backstack 和活动生命周期的东西,所以它真的很简单。

于 2012-10-18T04:55:24.890 回答