从活动中搜索片段ID

时间:2016-12-27 11:04:46

标签: java android android-studio android-fragments

我已经在Stack Overflow中尝试了大多数解决方案,但仍然无法按需要搜索片段ID。我在setBackgroundResource下的活动中尝试onCreate到我的图像按钮,但在编译时面对空引用对象。想知道如何从活动中调用片段中的id,当我搜索我的imagebutton id并运行它时,它总是返回null引用对象。

我试过了:

1)getView()

2)RootView()

3)

android.support.v4.app.Fragment liBrary = getSupportFragmentManager()
     .findFragmentById(R.id.imgbtn1);
   imgBtn1 = (ImageButton) Library.getActivity().findViewById(R.id.imgbtn1);
   imgBtn1.setBackgroundResource(R.mipmap.exercise);

4)

Fragment liBrary = getSupportFragmentManager()
     .findFragmentById(R.id.imgbtn1);
   imgBtn1 = (ImageButton) Library.getActivity().findViewById(R.id.imgbtn1);
   imgBtn1.setBackgroundResource(R.mipmap.exercise);

-Edited- 还只是为了更清楚地了解我如何设置我的片段: 的 MainActivity.java

  public class Homescreen extends AppCompatActivity implements TabLayout.OnTabSelectedListener {

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

  android.app.Fragment library = getFragmentManager().findFragmentById(R.id.libraryMain);

     (library.getView().findViewById(R.id.imgbtn1)).setBackgroundResource(R.mipmap.exercise);

}

Fragmentclass.java

public class Library extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState){
    LinearLayout libraryLL = (LinearLayout) inflater.inflate(R.layout.library,
            container, false);

希望这会有所帮助

3 个答案:

答案 0 :(得分:0)

你会在xml中创建片段时给出片段的id,这将作为一个容器。

<fragment android:name="com.example.yourfragment"
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    android.support.v4.app.Fragment Library = getSupportFragmentManager()
     .findFragmentById(R.id.test_fragment);
   imgbtn1 = (ImageButton) Library.getActivity().findViewById(R.id.imgbtn1);
   imgbtn1.setBackgroundResource(R.mipmap.exercise);

答案 1 :(得分:0)

在Fragment中创建一个方法

Fragment 类中,制作一个新的public方法,例如:

public void setFragmentBackground(Drawable mipmap) {

}

在此添加View fragmentView = getView()内 根据Fragment的XML布局,最好将其转换为。

然后添加另一行:

fragmentView.setBackground(mipmap);

然后在你的活动中打电话给:

(theFragment).setFragmentBackground(getDrawable(R.mipmap.exercise));

theFragment是你想要改变的片段。

<强> N.B

我遇到了类似的问题,请确保您没有在活动的onCreate()方法中调用该方法...片段没有足够的时间来创建,因此您不能调用该方法,因为Fragment是一个空对象。而是调用Fragment中的方法,但是这样:

LinearLayout libraryLL = (LinearLayout) inflater.inflate(R.layout.library, null);
libraryLL.setBackgroundResource(R.mipmap.exercise);

答案 2 :(得分:0)

如果您从活动中动态添加片段,请执行以下操作:

YourFragment yourFragment = new YourFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, yourFragment, YOUR_TAG)
            .commit();

然后你可以在你的片段中定义方法,如下所示:

public void setButtonBackground()
{
    ImageButton imgbtn1 = (ImageButton)view.findViewById(R.id.imgbtn1);
    imgbtn1.setBackgroundResource(R.mipmap.exercise);
}

从活动中调用它:

yourFragment.setButtonBackground();

UPD .: 如果你添加静态片段,你应该使用这个: 来自活动:

Fragment library = getFragmentManager().findFragmentById(R.id.test_fragment);
  ((ImageButton) library.getView().findViewById(R.id.imgbtn1)).setBackgroundResource(R.mipmap.exercise);