У меня есть пользовательский вид, который я хотел бы использовать внутри фрагмента. Логика вокруг взаимодействия с этим представлением должна находиться внутри Фрагмента (или объекта, принадлежащего этому фрагменту). В методе Фрагмента onCreateView
я раздуваю макет фрагмента. Сразу же после этого я пытаюсь получить ссылку на BadgeButton, используемую в макете.Как получить ссылку на пользовательский вид изнутри фрагмента
Проблема, которую я вижу, заключается в том, что я не могу получить ссылку на пользовательский вид. Когда две строки прокомментированы, как показано ниже, Activity будет загружаться правильно и соответствующим образом отобразить BadgeButton.
Когда я удалил фрагмент из этого примера и объединил его макет с таковым в MainActivity, он смог получить ссылку просто отлично. В чем причина такого поведения?
MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
}
}
}
MainFragment
public class MainFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
// BadgeButton badger = (BadgeButton) this.getActivity().findViewById(R.id.badger);
// badger.setBadgeText("example"); // NullPointerException
return rootView;
}
}
BadgeButton
public class BadgeButton extends FrameLayout {
private TextView mBadgeTextView;
public BadgeButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public void setBadgeText(String value) {
mBadgeTextView.setText(value);
}
private void init(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflate = inflater.inflate(R.layout.badge_button, this, true);
mBadgeTextView = (TextView) getChildAt(1);
mBadgeTextView.setText("0");
}
}
badge_button.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:textSize="18sp"
android:text="123"/>
</merge>
fragment_main.xml
<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:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.badgebutton.MainFragment">
<com.example.badgebutton.BadgeButton
android:id="@+id/badger"
android:layout_width="120dp"
android:layout_height="120dp"/>
</LinearLayout>
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.badgebutton.MainActivity"
tools:ignore="MergeRootFrame" />
Если у вас есть какие-либо мнения относительно качества этого вопроса или консультации по как улучшить этот и будущие вопросы, пожалуйста, дайте мне знать (в зависимости от того, каким образом Уместно). Я хотел бы задать хорошие вопросы и внести ценный вклад в сообщество. Спасибо.
Из нескольких вариантов, которые я пытался, это было как-то не среди них. Спасибо. – jneander
Я уже собирался. Мне сказали, что мне нужно подождать 1 минуту. (вздох) – jneander