StartActivityForResult 不适用于片段
StartActivityForResult Not Working with Fragments
我有一个片段作为底部导航的一部分。在片段中,我有一个按钮 select 图像并在 recyclerview 中显示。
我正在通过调用片段 class 中的方法来处理 recyclerview onBindViewHolder()
中此按钮的点击事件,如下所示:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TrendingHeaderViewHolder){
((TrendingHeaderViewHolder) holder).cameraShareIV.setOnClickListener( view -> {
TrendingFragment.newInstance().selectImage(); // this method is created in fragment class but called here in adapter
});
} else if (holder instanceof TrendingItemsViewHolder){
TestTrends tre = trendsList.get(position - 1);
Picasso.with(context)
.load(tre.getTestImage())
.placeholder(R.drawable.default_profile_photo)
.into(((TrendingItemsViewHolder) holder).testImgView);
}
}
在片段中,方法如下:
public void selectImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, GAL_REQ_CODE);
//context.startActivityForResult(intent, GAL_REQ_CODE); // tried with Activity and Context but still crashes
}
只要单击按钮,应用程序就会崩溃。这是 logcat 中的错误:
java.lang.IllegalStateException: Fragment TrendingFragment{171d0a0} not attached to Activity
at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1026)
at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1017)
at base.android.com.thumbsapp.UI.Fragments.TrendingFragment.selectImage(TrendingFragment.java:120)
at base.android.com.thumbsapp.Adapters.TrendingAdapter.lambda$onBindViewHolder[=12=]$TrendingAdapter(TrendingAdapter.java:59)
at base.android.com.thumbsapp.Adapters.TrendingAdapter$$Lambda[=12=].onClick(Unknown Source)
at android.view.View.performClick(View.java:5690)
at android.view.View$PerformClick.run(View.java:22693)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6269)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
这是我的 activity 底部导航片段膨胀的地方:
private final BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= item -> {
FragmentTransaction ft = null;
switch (item.getItemId()) {
case R.id.navigation_home:
viewpager.setCurrentItem(0);
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new HomeFragment());
ft.commit();
return true;
case R.id.navigation_trending:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new TrendingFragment());
ft.commit();
viewpager.setCurrentItem(2);
return true;
case R.id.navigation_chats:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new ChatsFragment());
ft.commit();
viewpager.setCurrentItem(3);
return true;
case R.id.navigation_profile:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new ProfileFragment());
ft.commit();
viewpager.setCurrentItem(4);
return true;
case R.id.navigation_search:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new SearchFragment());
ft.commit();
viewpager.setCurrentItem(1);
return true;
}
return false;
};
和布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="base.android.com.thumbsapp.UI.Activities.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/fragments"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_above="@+id/navigation"/>
<FrameLayout
android:id="@+id/fragContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_above="@+id/navigation"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:itemBackground="@android:color/white"
app:itemIconTint="@color/nav_bar_behave"
app:itemTextColor="@color/nav_bar_behave"
app:menu="@menu/navigation"
android:layout_alignParentBottom="true"/>
谁能解释一下应用崩溃的原因?
为什么应用程序崩溃了?
因为您的片段未附加到任何 activity.
您应该在您的片段中实现一个侦听器,以便在点击事件时从您的 viewHolder 调用。
在您的适配器中 class,定义一个接口
public interface OnItemClickListener {
void onItemClick();
}
while initializing your adapter class with listener implementation
public Adapter(OnItemClickListenerener listener){
this.listener = listener;
}
inside your view-holder:
viewHolder.itemView..setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick();}
}
最后,在您的封闭 activity 中实现此接口,然后让您的片段调用所需的方法。
此外,您应该将 onItemClick 侦听器事件代码从 onBindViewHolder
移动到 view-holder
我有一个片段作为底部导航的一部分。在片段中,我有一个按钮 select 图像并在 recyclerview 中显示。
我正在通过调用片段 class 中的方法来处理 recyclerview onBindViewHolder()
中此按钮的点击事件,如下所示:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TrendingHeaderViewHolder){
((TrendingHeaderViewHolder) holder).cameraShareIV.setOnClickListener( view -> {
TrendingFragment.newInstance().selectImage(); // this method is created in fragment class but called here in adapter
});
} else if (holder instanceof TrendingItemsViewHolder){
TestTrends tre = trendsList.get(position - 1);
Picasso.with(context)
.load(tre.getTestImage())
.placeholder(R.drawable.default_profile_photo)
.into(((TrendingItemsViewHolder) holder).testImgView);
}
}
在片段中,方法如下:
public void selectImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, GAL_REQ_CODE);
//context.startActivityForResult(intent, GAL_REQ_CODE); // tried with Activity and Context but still crashes
}
只要单击按钮,应用程序就会崩溃。这是 logcat 中的错误:
java.lang.IllegalStateException: Fragment TrendingFragment{171d0a0} not attached to Activity
at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1026)
at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:1017)
at base.android.com.thumbsapp.UI.Fragments.TrendingFragment.selectImage(TrendingFragment.java:120)
at base.android.com.thumbsapp.Adapters.TrendingAdapter.lambda$onBindViewHolder[=12=]$TrendingAdapter(TrendingAdapter.java:59)
at base.android.com.thumbsapp.Adapters.TrendingAdapter$$Lambda[=12=].onClick(Unknown Source)
at android.view.View.performClick(View.java:5690)
at android.view.View$PerformClick.run(View.java:22693)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6269)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
这是我的 activity 底部导航片段膨胀的地方:
private final BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= item -> {
FragmentTransaction ft = null;
switch (item.getItemId()) {
case R.id.navigation_home:
viewpager.setCurrentItem(0);
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new HomeFragment());
ft.commit();
return true;
case R.id.navigation_trending:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new TrendingFragment());
ft.commit();
viewpager.setCurrentItem(2);
return true;
case R.id.navigation_chats:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new ChatsFragment());
ft.commit();
viewpager.setCurrentItem(3);
return true;
case R.id.navigation_profile:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new ProfileFragment());
ft.commit();
viewpager.setCurrentItem(4);
return true;
case R.id.navigation_search:
ft = getSupportFragmentManager().beginTransaction()
.replace(R.id.fragContainer, new SearchFragment());
ft.commit();
viewpager.setCurrentItem(1);
return true;
}
return false;
};
和布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="base.android.com.thumbsapp.UI.Activities.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/fragments"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_above="@+id/navigation"/>
<FrameLayout
android:id="@+id/fragContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_above="@+id/navigation"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:itemBackground="@android:color/white"
app:itemIconTint="@color/nav_bar_behave"
app:itemTextColor="@color/nav_bar_behave"
app:menu="@menu/navigation"
android:layout_alignParentBottom="true"/>
谁能解释一下应用崩溃的原因?
为什么应用程序崩溃了? 因为您的片段未附加到任何 activity.
您应该在您的片段中实现一个侦听器,以便在点击事件时从您的 viewHolder 调用。
在您的适配器中 class,定义一个接口
public interface OnItemClickListener {
void onItemClick();
}
while initializing your adapter class with listener implementation
public Adapter(OnItemClickListenerener listener){
this.listener = listener;
}
inside your view-holder:
viewHolder.itemView..setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick();}
}
最后,在您的封闭 activity 中实现此接口,然后让您的片段调用所需的方法。
此外,您应该将 onItemClick 侦听器事件代码从 onBindViewHolder
移动到 view-holder