Fragment 中 Activity 的 ImageButton 的 setBackgroundResource
setBackgroundResource for ImageButton of Activity from Fragment
美好的一天!我有 1 个 MainActivity 和几个片段。 MainActivity 的布局有 3 个 ImageButtons,我想从 Fragment 更改它们的背景:所以我有带有滑动图片的 ViewPager,效果很好,在图片下方我有这些 ImageButtons。他们的背景是基于现在的照片。图片更改正常,但按钮背景随机更改(显然它有一些逻辑,但我无法理解)。所以问题出在 ImageButtons,它们的背景没有正确改变。
页面片段:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
public class PageFragment extends Fragment {
static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";
int pageNumber;
public static PageFragment newInstance(int page) {
PageFragment pageFragment = new PageFragment();
Bundle arguments = new Bundle();
arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
pageFragment.setArguments(arguments);
return pageFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.sliding_fragment, null);
ImageView ivPicture = (ImageView) view.findViewById(R.id.ivPic);
ImageButton btn1 = (ImageButton) getActivity().findViewById(R.id.imgBtn1);
ImageButton btn2 = (ImageButton) getActivity().findViewById(R.id.imgBtn2);
ImageButton btn3 = (ImageButton) getActivity().findViewById(R.id.imgBtn3);
switch (pageNumber) {
case 0:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back1);
btn1.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 1:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back2);
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 2:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back3);
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
break;
default:
break;
}
return view;
}
}
PageFragment 的布局 (sliding_fragment.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ivPic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</RelativeLayout>
具有内部 class MyFragmentPagerAdapter 的 MainActivity:
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
NewsFragment fragmentNews;
private static final int NUM_PAGES = 3;
private PagerAdapter pagerAdapter;
private static final String TAG = "myLogs";
@Override
protected void onCreate(Bundle savedInstanceState) {
...
fragmentNews = new NewsFragment();
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(R.id.container_for_fragments, fragmentNews).commit();
pagerAdapter = new MyFragmentPagerAdapter(fm);
}
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
}
private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(position);
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
}
fragment_news.xml(我放置 ViewPager 和按钮的地方)。我在 class NewsFragment:
中使用的这种布局
<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:weightSum="100"
tools:context=".fragments.NewsFragment">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_centerHorizontal="true"
android:layout_weight="10">
<ImageButton
android:id="@+id/imgBtn1"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/imgBtn2"
android:layout_toStartOf="@+id/imgBtn2"
android:background="@drawable/ic_radio_button_on_24dp"
android:clickable="true" />
<ImageButton
android:id="@+id/imgBtn2"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/ic_radio_button_off_24dp"
android:clickable="true" />
<ImageButton
android:id="@+id/imgBtn3"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toEndOf="@+id/imgBtn2"
android:layout_toRightOf="@+id/imgBtn2"
android:background="@drawable/ic_radio_button_off_24dp"
android:clickable="true" />
</RelativeLayout>
...
</LinearLayout>
查看 Fragment 与 activity 的通信。 http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/
使用接口你可以实现这个
我找到了问题的答案。所以你必须把这段代码放在 MainActivity.java in viewIsCreated():
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
ImageButton btn1 = (ImageButton) findViewById(R.id.imgBtn1);
ImageButton btn2 = (ImageButton) findViewById(R.id.imgBtn2);
ImageButton btn3 = (ImageButton) findViewById(R.id.imgBtn3);
@Override
public void onPageSelected(int position) {
Log.d(TAG, "onPageSelected, position = " + position);
switch (position) {
case 0:
btn1.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 1:
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 2:
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
break;
default:
break;
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
美好的一天!我有 1 个 MainActivity 和几个片段。 MainActivity 的布局有 3 个 ImageButtons,我想从 Fragment 更改它们的背景:所以我有带有滑动图片的 ViewPager,效果很好,在图片下方我有这些 ImageButtons。他们的背景是基于现在的照片。图片更改正常,但按钮背景随机更改(显然它有一些逻辑,但我无法理解)。所以问题出在 ImageButtons,它们的背景没有正确改变。
页面片段:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
public class PageFragment extends Fragment {
static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";
int pageNumber;
public static PageFragment newInstance(int page) {
PageFragment pageFragment = new PageFragment();
Bundle arguments = new Bundle();
arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
pageFragment.setArguments(arguments);
return pageFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.sliding_fragment, null);
ImageView ivPicture = (ImageView) view.findViewById(R.id.ivPic);
ImageButton btn1 = (ImageButton) getActivity().findViewById(R.id.imgBtn1);
ImageButton btn2 = (ImageButton) getActivity().findViewById(R.id.imgBtn2);
ImageButton btn3 = (ImageButton) getActivity().findViewById(R.id.imgBtn3);
switch (pageNumber) {
case 0:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back1);
btn1.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 1:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back2);
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 2:
ivPicture.setBackgroundResource(R.drawable.flowers_no_back3);
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
break;
default:
break;
}
return view;
}
}
PageFragment 的布局 (sliding_fragment.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ivPic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
</RelativeLayout>
具有内部 class MyFragmentPagerAdapter 的 MainActivity:
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
NewsFragment fragmentNews;
private static final int NUM_PAGES = 3;
private PagerAdapter pagerAdapter;
private static final String TAG = "myLogs";
@Override
protected void onCreate(Bundle savedInstanceState) {
...
fragmentNews = new NewsFragment();
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(R.id.container_for_fragments, fragmentNews).commit();
pagerAdapter = new MyFragmentPagerAdapter(fm);
}
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
}
private class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(position);
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
}
fragment_news.xml(我放置 ViewPager 和按钮的地方)。我在 class NewsFragment:
中使用的这种布局<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:weightSum="100"
tools:context=".fragments.NewsFragment">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_centerHorizontal="true"
android:layout_weight="10">
<ImageButton
android:id="@+id/imgBtn1"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/imgBtn2"
android:layout_toStartOf="@+id/imgBtn2"
android:background="@drawable/ic_radio_button_on_24dp"
android:clickable="true" />
<ImageButton
android:id="@+id/imgBtn2"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/ic_radio_button_off_24dp"
android:clickable="true" />
<ImageButton
android:id="@+id/imgBtn3"
android:layout_width="@dimen/toggle_button_size"
android:layout_height="@dimen/toggle_button_size"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_toEndOf="@+id/imgBtn2"
android:layout_toRightOf="@+id/imgBtn2"
android:background="@drawable/ic_radio_button_off_24dp"
android:clickable="true" />
</RelativeLayout>
...
</LinearLayout>
查看 Fragment 与 activity 的通信。 http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/
使用接口你可以实现这个
我找到了问题的答案。所以你必须把这段代码放在 MainActivity.java in viewIsCreated():
public void viewIsCreated() {
ViewPager pager = fragmentNews.getPager();
pager.setAdapter(pagerAdapter);
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
ImageButton btn1 = (ImageButton) findViewById(R.id.imgBtn1);
ImageButton btn2 = (ImageButton) findViewById(R.id.imgBtn2);
ImageButton btn3 = (ImageButton) findViewById(R.id.imgBtn3);
@Override
public void onPageSelected(int position) {
Log.d(TAG, "onPageSelected, position = " + position);
switch (position) {
case 0:
btn1.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 1:
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
break;
case 2:
btn1.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn2.setBackgroundResource(R.drawable.ic_radio_button_off_24dp);
btn3.setBackgroundResource(R.drawable.ic_radio_button_on_24dp);
break;
default:
break;
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}