热门更改片段内的父文本Text的文本?

时间:2015-10-31 07:25:14

标签: android android-fragments

在我的Fragemt.java中有类似的内容:

public class MainFragment extends Fragment implements View.OnClickListener {
    private TextView mTitleTextView;
    [...] irrelevant code cut out

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        [...] some other code

        mTitleTextView = (TextView) rootView.findViewById(R.id.titleTextView);
        mTitleTextView.setText("Text I Want to Set"); // Problem! App crashes on start if TextView isn't part of the fragment
        [...] more irrelevant code

现在工作正常。应用程序总是crashed加载后,我正在搜索几个小时。问题是TextView (R.id.titleTextView)位于父活动的XML,而不是分配给该片段的xml。

有没有办法可以从片段java代码中更改父TextView的文本?

EDIT logcat信息

10-31 11:10:16.992 3259-3259/? E/AndroidRuntime: FATAL EXCEPTION: main
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime: Process: com.example.sebastian.recyclerlist, PID: 3259
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sebastian.recyclerlist/com.example.sebastian.recyclerlist.MainActivity}: android.view.InflateException: Binary XML file line #20: Error inflating class fragment
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5254)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:  Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class fragment
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.example.sebastian.recyclerlist.MainActivity.onCreate(MainActivity.java:38)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5990)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5254) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.example.sebastian.recyclerlist.MainActivity.setText(MainActivity.java:49)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.example.sebastian.recyclerlist.MainFragment.updateList(MainFragment.java:160)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.example.sebastian.recyclerlist.MainFragment.onCreateView(MainFragment.java:107)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1965)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1047)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1237)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1339)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2295)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:314)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.example.sebastian.recyclerlist.MainActivity.onCreate(MainActivity.java:38) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5990) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5254) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
10-31 11:10:16.992 3259-3259/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

2 个答案:

答案 0 :(得分:3)

您可以使用TextView更改Activity托管Fragment的{​​{1}}中的文字。这个答案改编自here

interface

public class BlankFragment extends Fragment implements View.OnClickListener{ private View rootView; private EditText editText; private Button button; private OnFragmentInteractionListener mListener; //Your Activity will implement this interface public interface OnFragmentInteractionListener { void onFragmentInteraction(String message); } public static BlankFragment newInstance() { return new BlankFragment(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); } } 内部onClick()或其他任何地方调用Fragment

public void onButtonPressed(String message) {
    if (mListener != null) {
        mListener.onFragmentInteraction(message);
    }
}

Activity的外观示例:

public class MainActivity extends AppCompatActivity implements BlankFragment.OnFragmentInteractionListener{

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_view_id);

        if (getFragmentManager().findFragmentById(R.id.fragment_container) == null) {
            getFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_container, BlankFragment.newInstance())
                    .commit();
        }
    }

    @Override
    public void onFragmentInteraction(String message) {
        mTextView.setText(String message);
    }
}

修改:我还应提及另一种方法,您可以在托管TextView中将public字段设置为Activity,并将其设置为{ {1}}将Fragment转换为适当的类型:

getActivity()

这更容易"从某种意义上说,它需要更少的打字,但我不会推荐它((MainActivity)getActivity()).mTextView.setText("Text to set"); FragmentActivity

答案 1 :(得分:0)

@ PPartisan的答案很好。但是我个人更喜欢这种模式的一点改变。

在我看来,Activity更好地实现了接口而不是片段。换句话说,假设我们在某些时候有多个片段倾向于附加到此活动。因此,让每个片段都有自己的界面并不是那么好。

我的解决方案

  • 声明一个名为IParentActivity的Java接口。
  • 获取实施此界面的主要活动。
  • 在您的活动类中实现接口的必要方法。
  • 每当片段想要与活动进行通信时。它应该做这样的事情:

    IParentActivity parent = (IParentActivity) getActivity();
    parent.someMethod();