【问题标题】:getSupportFragmentManager().getFragments() works, but not findFragmentByTag("name");getSupportFragmentManager().getFragments() 有效,但 findFragmentByTag("name");
【发布时间】:2017-05-25 17:05:31
【问题描述】:

我只是想在我的主要活动的片段中运行一个方法。 getFragments() 正确列出了我的应用程序中的所有片段。但是,当调用 findFragmentByTag() 时,结果始终为空!我环顾四周,似乎没有任何解决方案有帮助。

这是我调用片段管理器的地方

fm.executePendingTransactions();
Log.d("Fragmento", fm.getFragments().toString());
Log.d("Fragmento", fm.findFragmentByTag("frag3").toString());

fm 在哪里

`FragmentManager fm = getSupportFragmentManager();`

我的片段代码是

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;



public class Fragment3 extends Fragment {
    TextView  status;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment3, container, false);
    Log.d("InFragment", this.getClass().toString());
    return v;
}

public static Fragment3 newInstance() {
    Fragment3 f = new Fragment3();
    return f;
}

    public void setStatus(String msg){
        status = (TextView)getView().findViewById(R.id.canLog);
        status.setText(status.getText()+"\n"+msg);
    }

}

我的布局非常简单,我在布局中为片段定义了一个 ID 和一个标签。

`<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:tag="frag3"
    android:id="@+id/fragment3">
</LinearLayout>`

最后是我的错误日志

05-25 16:56:54.949 13263-13263/com.archronix.infotainment E/AndroidRuntime: 
FATAL EXCEPTION: main

Process: com.archronix.infotainment, PID: 13263

java.lang.IllegalStateException: Could not execute method for 
android:onClick

at android.view.View$DeclaredOnClickListener.onClick(View.java:4458)

at android.view.View.performClick(View.java:5204)

at android.view.View$PerformClick.run(View.java:21155)

at android.os.Handler.handleCallback(Handler.java:739)

at android.os.Handler.dispatchMessage(Handler.java:95)

at android.os.Looper.loop(Looper.java:148)

at android.app.ActivityThread.main(ActivityThread.java:5422)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:726)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Caused by: java.lang.reflect.InvocationTargetException

at java.lang.reflect.Method.invoke(Native Method)

at android.view.View$DeclaredOnClickListener.onClick(View.java:4453)

at android.view.View.performClick(View.java:5204) 

at android.view.View$PerformClick.run(View.java:21155) 

at android.os.Handler.handleCallback(Handler.java:739) 

at android.os.Handler.dispatchMessage(Handler.java:95) 

at android.os.Looper.loop(Looper.java:148) 

at android.app.ActivityThread.main(ActivityThread.java:5422) 

at java.lang.reflect.Method.invoke(Native Method) 

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:726) 

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 
'java.lang.String android.support.v4.app.Fragment.toString()' on a null 
object reference

at 
com.archronix.infotainment.MainActivity.buttonClicked(MainActivity.java:445)

at java.lang.reflect.Method.invoke(Native Method) 

at android.view.View$DeclaredOnClickListener.onClick(View.java:4453) 

at android.view.View.performClick(View.java:5204) 

at android.view.View$PerformClick.run(View.java:21155) 

at android.os.Handler.handleCallback(Handler.java:739) 

at android.os.Handler.dispatchMessage(Handler.java:95) 

at android.os.Looper.loop(Looper.java:148) 

at android.app.ActivityThread.main(ActivityThread.java:5422) 

at java.lang.reflect.Method.invoke(Native Method) 

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:726) 

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这可能是一个非常愚蠢的问题,但片段似乎完全让我感到困惑。

【问题讨论】:

    标签: android user-interface null fragment


    【解决方案1】:

    问题: 在 LinearLayout 中设置标签不起作用,Fragmentmangager 找不到它

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:tag="frag3"           <-- not good
        android:id="@+id/fragment3">
    

    `

    解决方案:

    如果您在 xml 中定义片段:

     <fragment android:name="com.example.YourFragment"
            android:id="@+id/frag3Id"
            android:layout_width="match_parent"
            android:tag="frag3"
            android:layout_height="match_parent" />
    

    您可以通过以下方式找到它:

    fm.findFragmentByTag("frag3")
    

     fm.findFragmentById(R.id.frag3Id)
    

    或者您可以使用 FragmentTransaction 的 addreplace 函数设置标签

    【讨论】:

    • 我会将片段 xml 放在 mainactivity 布局还是片段布局中?
    • @ArinYaldizciyan 在主布局中。 (片段的目标位置)。
    • 谢谢!如果我使用 viewpager 和 tablayout 设置在片段视图之间切换,我假设这也是正确的。
    • @ArinYaldizciyan 是的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多