Java 从片段图像打开片段按钮单击?
我遇到了打开另一个片段的问题。我的主要活动实现了最新的导航抽屉,导航栏列表中的每个选项都会打开一个新片段。这些措施都得到了实施,而且效果良好。我遇到的问题是下一层碎片。我有一个带有imageButton的事件片段。单击此按钮时,我需要导航到此子事件的新片段。我尝试在打开子事件页面的事件片段中创建onclicklistener,但出现以下错误 未找到片段imageFragment1{348db088#0 id=0x7f08000a}的id 0x7f08000a(com.ikimuhendis.ldrawer.sample:id/imagefrag)的视图Java 从片段图像打开片段按钮单击?,java,android,android-layout,android-fragments,navigation-drawer,Java,Android,Android Layout,Android Fragments,Navigation Drawer,我遇到了打开另一个片段的问题。我的主要活动实现了最新的导航抽屉,导航栏列表中的每个选项都会打开一个新片段。这些措施都得到了实施,而且效果良好。我遇到的问题是下一层碎片。我有一个带有imageButton的事件片段。单击此按钮时,我需要导航到此子事件的新片段。我尝试在打开子事件页面的事件片段中创建onclicklistener,但出现以下错误 未找到片段imageFragment1{348db088#0 id=0x7f08000a}的id 0x7f08000a(com.ikimuhendis.ld
public class EventFragment extends Fragment
{
ImageButton test;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_event, container, false);
SliderLayout sliderShow = (SliderLayout) rootView.findViewById(R.id.slider);
sliderShow.setDuration(8000);
sliderShow.setPresetTransformer(SliderLayout.Transformer.ZoomOut);
//get the button view
test = (ImageButton) rootView.findViewById(R.id.imageButton);
test.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Fragment videoFragment = new imageFragment1();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.imagefrag, videoFragment)
.commit();
}
});
HashMap<String, Integer> file_maps = new HashMap<String, Integer>();
file_maps.put("Munster Vs Leinster", R.drawable.rugby);
file_maps.put("Ennio Morricone", R.drawable.ennio);
file_maps.put("Leinster Vs Harlequins", R.drawable.heino);
file_maps.put("WWE Live", R.drawable.wwe);
for (
String name
: file_maps.keySet())
{
TextSliderView textSliderView = new TextSliderView(getActivity());
textSliderView
.description(name)
.image(file_maps.get(name));
sliderShow.addSlider(textSliderView);
}
getActivity().setTitle("Events");
return rootView;
}
}
imageFragment1 xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:id="@id/imagefrag" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="This is a test"
android:id="@+id/textView"
android:layout_marginTop="41dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
我很不确定碎片事务应该发生在哪里。在我的主要活动中,片段事务发生在导航抽屉的开关块中。我读过“请注意,片段不应直接替换自身或任何其他片段。片段应该是独立的实体。片段应该做的是通知其父活动某个事件已经发生。但是,再一次,决定如何处理它不是一项零碎的工作!这应该是一项活动,即更换手机上的碎片,但在平板电脑上现有碎片的基础上添加另一个碎片。因此,你基本上是在故意做错事。”
另一张海报提到“处理这种情况的更好方法是为主活动创建一个回调实现来处理请求,例如启动一个新片段”。我如何在我的主活动中设置它,以便它与抽屉片段的子片段进行通信。对此有何想法,我将不胜感激
主要活动
public class SampleActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerArrowDrawable drawerArrow;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
CustomDrawerAdapter adapter;
List<DrawerItem> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
ActionBar ab = getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setHomeButtonEnabled(true);
dataList = new ArrayList<DrawerItem>();
dataList.add(new DrawerItem("Home", R.drawable.home));
dataList.add(new DrawerItem("How It Works", R.drawable.howitworks));
dataList.add(new DrawerItem("Events", R.drawable.events));
dataList.add(new DrawerItem("Profile", R.drawable.signin));
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.navdrawer);
drawerArrow = new DrawerArrowDrawable(this)
{
@Override
public boolean isLayoutRtl() {
return false;
}
};
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
drawerArrow, R.string.drawer_open,R.string.drawer_close)
{
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
dataList);
/* ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, mNames); */
mDrawerList.setAdapter(adapter);
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
{
displayView(position);
// Running Fragment Transaction code here
}
}
// Method that updates content frame with different fragments
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
Bundle args = new Bundle();
switch (position) {
case 0:
fragment = new TitleFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 1:
fragment = new HowFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 2:
fragment = new EventFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 3:
fragment = new ProfileFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
}
fragment.setArguments(args);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(dataList.get(position).getItemName());
mDrawerLayout.closeDrawer(mDrawerList);
}
});
}
@Override
public void setTitle(CharSequence title)
{
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
return false;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
public类SampleActivity扩展活动{
私人抽屉布局mDrawerLayout;
私有列表视图mDrawerList;
私有操作bardrawertoggle mDrawerToggle;
私人抽屉可抽出式抽屉;
私有字符序列mDrawerTitle;
私有字符序列mTitle;
雷达适配器;
列表数据列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_示例);
ActionBar ab=getActionBar();
ab.setDisplayHomeAsUpEnabled(真);
ab.setHomeButtonEnabled(真);
dataList=newarraylist();
数据列表。添加(新的抽屉(“主”,R.drawable.Home));
添加(新的DrawerItem(“它是如何工作的”,R.drawable.howitworks));
添加(新的DrawerItem(“Events”,R.drawable.Events));
数据列表。添加(新的付款人(“配置文件”,R.drawable.signin));
mTitle=mDrawerTitle=getTitle();
mDrawerLayout=(抽屉布局)findViewById(R.id.抽屉布局);
mDrawerList=(ListView)findViewById(R.id.navdrawer);
抽屉行=新抽屉行可绘制(此)
{
@凌驾
公共布尔isLayoutRtl(){
返回false;
}
};
mDrawerToggle=新操作BarDrawerToggle(此,mDrawerLayout,
抽屉行,右弦。抽屉(打开,右弦。抽屉(关闭)
{
公共无效onDrawerClosed(视图){
super.onDrawerClosed(视图);
getActionBar().setTitle(mTitle);
InvalidateOptions SMenu();//创建对OnPrepareOptions SMenu()的调用
}
打开图纸上的公共空白(视图抽屉视图){
super.onDrawerOpened(抽屉视图);
getActionBar().setTitle(mDrawerTitle);
InvalidateOptions SMenu();//创建对OnPrepareOptions SMenu()的调用
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
适配器=新的CustomDrawerRadepter(此,R.layout.custom_抽屉项目,
数据表);
/*ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,android.R.id.text1,mNames)*/
mDrawerList.setAdapter(适配器);
mDrawerList.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
{
显示视图(位置);
//在这里运行片段事务代码
}
}
//使用不同片段更新内容框架的方法
私有void显示视图(内部位置){
//通过替换片段更新主要内容
片段=空;
Bundle args=新Bundle();
开关(位置){
案例0:
片段=新的标题片段();
mDrawerToggle.setAnimateEnabled(true);
抽屉行设置进度(1f);
mDrawerToggle.syncState();
打破
案例1:
fragment=新的HowFragment();
mDrawerToggle.setAnimateEnabled(true);
抽屉行设置进度(1f);
mDrawerToggle.syncState();
打破
案例2:
fragment=neweventfragment();
mDrawerToggle.setAnimateEnabled(true);
抽屉行设置进度(1f);
mDrawerToggle.syncState();
打破
案例3:
fragment=新的ProfileFragment();
mDrawerToggle.setAnimateEnabled(true);
抽屉行设置进度(1f);
mDrawerToggle.syncState();
打破
public class SampleActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerArrowDrawable drawerArrow;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
CustomDrawerAdapter adapter;
List<DrawerItem> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
ActionBar ab = getActionBar();
ab.setDisplayHomeAsUpEnabled(true);
ab.setHomeButtonEnabled(true);
dataList = new ArrayList<DrawerItem>();
dataList.add(new DrawerItem("Home", R.drawable.home));
dataList.add(new DrawerItem("How It Works", R.drawable.howitworks));
dataList.add(new DrawerItem("Events", R.drawable.events));
dataList.add(new DrawerItem("Profile", R.drawable.signin));
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.navdrawer);
drawerArrow = new DrawerArrowDrawable(this)
{
@Override
public boolean isLayoutRtl() {
return false;
}
};
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
drawerArrow, R.string.drawer_open,R.string.drawer_close)
{
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
dataList);
/* ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, mNames); */
mDrawerList.setAdapter(adapter);
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
{
displayView(position);
// Running Fragment Transaction code here
}
}
// Method that updates content frame with different fragments
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
Bundle args = new Bundle();
switch (position) {
case 0:
fragment = new TitleFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 1:
fragment = new HowFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 2:
fragment = new EventFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
case 3:
fragment = new ProfileFragment();
mDrawerToggle.setAnimateEnabled(true);
drawerArrow.setProgress(1f);
mDrawerToggle.syncState();
break;
}
fragment.setArguments(args);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(dataList.get(position).getItemName());
mDrawerLayout.closeDrawer(mDrawerList);
}
});
}
@Override
public void setTitle(CharSequence title)
{
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
return false;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
private OnDataPass dataPasser;
//Interface, trought the fragment can comunicate with activity
public interface OnDataPass {
public void onDataPass();
}
//Method, which you call in your onClickListener
public void passData() {
// Method in the Activity
dataPasser.onDataPass();
}
//Method, which creates the interface
@Override
public void onAttach(Activity a) {
super.onAttach(a);
try {
dataPasser = (OnDataPass) a;
} catch (ClassCastException e) {
throw new ClassCastException(a.toString() + " must implement onDataPass");
}
}
// You can also pass arguments, if you need
@Override
public void onDataPass() {
//Do your code for switching the fragments or anything else
...
}
public class ActivityMain extends Activity implements OnDataPass{