2012-10-10 122 views
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) 
+0

任何人都可以帮助我吗? – Bryan

+0

这是不是很清楚你想要做什么。一个活动(屏幕)上的所有片段? 这似乎也许你正在尝试拥有分屏类型布局 - 右侧的列表视图和左侧的选项卡片段,并且当您单击领导片段中的某个按钮时,列表视图将更改为不同的列表?是对的吗? – athor

+0

不,我不想做一个分割屏幕,我想要能够单击一个片段中的按钮,并开始另一个片段或活动显示一个单独的列表视图 – Bryan

回答

4

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

因此,在ClickClick 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将处理所有的后台和活动生命周期,所以它非常简单。

+0

我编辑我的原始帖子,添加您在这里提供的代码,我现在没有错误,但是当我现在单击领导标签时强制关闭应用程序,它会拉起前的观点,任何想法为什么 – Bryan

+0

我认为代码会probally工作正常,但它没有定义所需的布局,我试图在创建后使用setContentView方法,但扔了错误也是如此。我想我需要某种布局的充气器,但不知道如何定义它 – Bryan

+0

我已经使用片段中的onCreateView方法编辑了我的答案。尝试一下,并发布更多的问题(包含错误的堆栈跟踪)。 – athor

相关问题