Android 在自定义视图中访问片段引用

Android 在自定义视图中访问片段引用,android,android-fragments,android-custom-view,Android,Android Fragments,Android Custom View,我有一个场景,片段的布局中有一个customview(通过扩展View类)。自定义视图必须访问片段的某些方法。但我无法在自定义视图中获取片段引用。此外,我无法从自定义视图(它是fragment的子视图)中访问fragment 根据android片段:我们在视图的构造函数中获取上下文。此上下文是活动的实例。但是,无法获取承载customview的片段的引用 请让我知道如何访问customview中的片段 编辑: 添加代码以更好地了解我的问题: java 公共类MyFragment扩展了Fragme

我有一个场景,片段的布局中有一个customview(通过扩展View类)。自定义视图必须访问片段的某些方法。但我无法在自定义视图中获取片段引用。此外,我无法从自定义视图(它是fragment的子视图)中访问fragment

根据android片段:我们在视图的构造函数中获取上下文。此上下文是活动的实例。但是,无法获取承载customview的片段的引用

请让我知道如何访问customview中的片段

编辑:

添加代码以更好地了解我的问题:

java

公共类MyFragment扩展了Fragment{

int selectedOptionIndex;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
//get value of selectedOptionIndex from bundle and save it to this.selectedOptionIndex;

}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
this.activity = activity;

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.myFragmentview, container, false);
    return view;
//我可以从片段访问视图,但不能从片段访问视图。
}

}

myFragmentview.xml

//现在使用上下文,我们可以访问此customView中的activity insatnce,并可以调用activity实例的任何方法。
//但我们不能对碎片这样做。此时无法访问父片段。我无法访问selectedOptionIndex并在此视图中使用它进行设置。
//如果视图可以访问父activty,那么它也应该可以访问父片段。

}

}好的。用你自己的话来说:

根据android片段:我们在 这些观点。此上下文是活动的实例。但是没有 获取托管customview的片段引用的方法

所以,上下文就是活动的实例,对吗?现在从这个活动上下文中,我相信如果您分别使用
findframentbytag(string tag)
findframentbyid(int id)
为您的片段提供了字符串标记名或id,您就可以获得对片段的引用

context.getFragmentManager().findFragmentByTag("tag_of_frag_you_are_trying_to_access");

HTH.

我找到了解决方案,并与我一起尝试

在自定义视图的构造函数中,获取上下文的引用并将其强制转换为活动类

private Activity activity ;
public EasCalWeekViewHeader1(Context context){
    activity = (Activity) context ; 
}

在方法中,您要调用片段方法

yourFragment a= activity.getFragmentManager().findFragmentById(R.id.fragment1);
a.YourMethod();

使用视图的构造函数将片段本身传递给其活动。它是一个深度副本,因此您可以从视图中访问片段

public class YourView extends View
{
     Fragment yourfragmentinside;
     public YourView(Fragment inputyourfragment)
     {
        this.yourfragmentinside = inputyourfragment
     }
}


不要担心它是同一个片段-如果您不使用new…()-

我正在尝试使用
findFragmentByTag
来查找片段,但是在我的项目中添加标记并不容易,而且片段是一个自定义片段类。所以我迭代这些片段来找到它。代码片段如下所示:

MyFragment myFrag = null;
List<Fragment> fragments = getContext().getSupportFragmentManager().getFragments();
for (Fragment frag : fragments) {
    if (frag instanceof MyFragment) {
        myFrag = (MyFragment) frag;
        break;
    }
}
MyFragment myFrag=null;
列表片段=getContext().getSupportFragmentManager().getFragments();
用于(碎片碎片:碎片){
if(MyFragment的frag实例){
myFrag=(MyFragment)frag;
打破
}
}

调用
FragmentManager.findFragment(this)
,其中
this
是您的自定义视图

或者,如果使用Kotlin的片段库
androidx.Fragment:Fragment ktx
,则只需在视图中使用扩展函数
View.findFragment()

其定义如下:

fun <F : Fragment> View.findFragment(): F = FragmentManager.findFragment(this)
fun View.findFragment():F=FragmentManager.findFragment(此)
从文件中:

此方法将定位与此视图关联的片段。对于Fragment.onCreateView及其子级返回的视图,会自动填充此字段


同意,这是在任何视图中访问片段的更好方法。是的,我们可以使用getFragmentManager()访问片段。harikris和你的答案都可以接受。但是由于harikris的答案是第一位的,所以当您没有为片段指定id或标记时(比如在开发自定义视图时),我将其标记为Accepted,我认为这是最好的调用方法。我使用这个方法来获取包含我的自定义视图的片段或活动,如下所示。val parent=try{//get fragment(如果我们在fragment FragmentManager.findFragment(widget)}catch(exception:IllegalStateException){//else get activity context}但是您需要在gradle文件中添加实现“androidx.fragment:fragment ktx:1.2.4”
public class YourView extends View
{
     Fragment yourfragmentinside;
     public YourView(Fragment inputyourfragment)
     {
        this.yourfragmentinside = inputyourfragment
     }
MyFragment myFrag = null;
List<Fragment> fragments = getContext().getSupportFragmentManager().getFragments();
for (Fragment frag : fragments) {
    if (frag instanceof MyFragment) {
        myFrag = (MyFragment) frag;
        break;
    }
}
fun <F : Fragment> View.findFragment(): F = FragmentManager.findFragment(this)