findViewById 在 Fragment 而不是在 (On)CreateView

findViewById in Fragment and not in (On)CreateView

我有一个 Activity 并使用适配器填充网格。当按下网格中的项目时,我想更改 "NavbarFragment" 中 TextView 的文本。

CategoryActivity.java:

 GridView grid = (GridView) findViewById(R.id.gridlayout_grid);
 grid.setAdapter(new GridAdapter(tiles));

CategoryActivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical"
tools:context=".Activity.CategoryActivity">

<fragment android:name="app_a_tize.expressme.Fragment.NavbarFragment"
    android:id="@+id/fragNavbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<GridView
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:layout_margin="5dp"
    android:verticalSpacing="10dp"
    android:gravity="center"
    android:horizontalSpacing="10dp"
    android:layout_gravity="center"
    android:id="@+id/gridlayout_grid"/>

<fragment android:name="app_a_tize.expressme.Fragment.ConversationbarFragment"
    android:id="@+id/fragConversation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

GridAdapter.java中的onClickListener:

view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView textView = (TextView) v.findViewById(R.id.item_name);
            String tileName = textView.getText().toString();
            System.out.println("tileName" + tileName);
            ConversationBarManager.getInstance().addWord(tileName);
            NavbarFragment navbar = new NavbarFragment();
            navbar.changeConversationBarString();
        }
   });

NavbarFragment.java中的函数:

public void changeConversationBarString(){
    TextView conversationBar = (TextView) ?????.findViewById(R.id.conversationBar);
  conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}

在这个函数中^我想更改片段中TextView conversationBar 的文本。但我无法获得 TextView,因为无论我尝试什么,我都会得到一个 NullPointer。因为 findViewById 不起作用。

所有关于findViewById的问题都说可以使用:onCreateView()方法中的getView()。

我的问题是:当单击网格中的项目时,如何更改 NavbarFragment 中我的 TextView 的文本 属性。

您可能想要做的是更早地初始化 TextView。在#onCreateView()

像这样:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_fragment, container, false);

    mMyTextView = (TextView) view.findViewById(R.id.my_text_view);
}

然后在您的 public 方法中:

public void changeConversationBarString(){
  mMyTextView.setText(ConversationBarManager.getInstance().getConversationBarString());
}

最好的方法是使用 Butterknife Butterknife 是一个强大的工具

在依赖项上:

 compile 'com.jakewharton:butterknife:7.0.1'

以及您绑定的代码:

public class MainActivity extends ActionBarActivity {

private static final int TAB_REMOTE_POSITION = 0;
private static final int TAB_SOCIAL_POSITION = 1;

private RemoteFragment remoteFragment;
private ChatFragment chatFragment;
private BluetoothSPP bt;
private boolean bBluetooth = true;
private WiFiP2pService wiFiP2pService;

@Bind(R.id.view_pager)
ViewPager viewPager;
@Bind(R.id.tab_layout)
TabLayout tabLayout;

在你初始化的片段上(oncreate):

  ButterKnife.bind(this, v);

activity:

ButterKnife.bind(this);

因为您没有使用 FragmentManager 将 Fragment 添加到布局中,所以不会调用 FragmentonCreateView 方法。

由于无法立即附加片段,因此最好从片段的 onViewCreated 方法中调用 changeConversationBarString

在您的 activity 中确保附上您的片段:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, new NavbarFragment());
ft.commit();

NavbarFragment中:

public void onViewCreated() {
  changeConversationBarString();
}

public void changeConversationBarString(){
  TextView conversationBar = (TextView) getView().findViewById(R.id.conversationBar);
  conversationBar.setText(ConversationBarManager.getInstance().getConversationBarString());
}