2014-02-12 2 views
0

У меня есть пользовательский вид, который я хотел бы использовать внутри фрагмента. Логика вокруг взаимодействия с этим представлением должна находиться внутри Фрагмента (или объекта, принадлежащего этому фрагменту). В методе Фрагмента 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" /> 

Если у вас есть какие-либо мнения относительно качества этого вопроса или консультации по как улучшить этот и будущие вопросы, пожалуйста, дайте мне знать (в зависимости от того, каким образом Уместно). Я хотел бы задать хорошие вопросы и внести ценный вклад в сообщество. Спасибо.

ответ

1
BadgeButton badger = (BadgeButton) rootView.findViewById(R.id.badger); 
badger.setBadgeText("example"); 

Используйте это с точки зрения связано с Fragment а не Activity.

+0

Из нескольких вариантов, которые я пытался, это было как-то не среди них. Спасибо. – jneander

+0

Я уже собирался. Мне сказали, что мне нужно подождать 1 минуту. (вздох) – jneander

Смежные вопросы