Android ViewFlow&;CircleFlowIndicator-空指针异常
我正在使用Android ViewFlow&;CircleFlowIndicator-空指针异常,android,viewflow,Android,Viewflow,我正在使用ViewFlow和CircleFlowIndicator查看和显示圆圈指示查看中的更改 我仍然为每个视图显示相同的文本,请参见下图: 注意: 仍在文本视图1中显示“记住生活”,文本视图2中显示“即时搜索记忆中的朋友……” 现在我想基于查看位置显示文本,例如示例: 如果视图位置为0则需要在文本视图1中显示“文本视图-1.0”,文本视图2中显示“文本视图-2.0”,如果视图位置为1则需要在文本视图1中显示“文本视图-1.1,“TextView-2.1”在textView2和中,依此类推
ViewFlow
和CircleFlowIndicator
查看和显示圆圈指示查看中的更改
我仍然为每个视图显示相同的文本,请参见下图:
注意:
仍在文本视图1中显示“记住生活”
,文本视图2中显示“即时搜索记忆中的朋友……”
现在我想基于查看位置显示文本,例如示例:
如果视图位置为0则需要在文本视图1中显示“文本视图-1.0
”,文本视图2中显示“文本视图-2.0
”,如果视图位置为1则需要在文本视图1中显示“文本视图-1.1
,“TextView-2.1
”在textView2和中,依此类推
但每次,我都在行号处得到空指针异常
-35
这是:position=viewFlow.getPositionForView(indi);
如何知道ViewFlow的当前视图位置?
MainActivity.java:-
public class MainActivity extends Activity {
private ViewFlow viewFlow;
TextView textView1, textView2;
int position = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.circle_title);
setContentView(R.layout.screen_layout);
viewFlow = (ViewFlow) findViewById(R.id.viewflow);
viewFlow.setAdapter(new ImageAdapter(this), 1); // default focus on second circle
CircleFlowIndicator indic = (CircleFlowIndicator) findViewById(R.id.viewflowindic);
viewFlow.setFlowIndicator(indic);
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
position = viewFlow.getPositionForView(indic);
Toast.makeText(MainActivity.this, position, Toast.LENGTH_LONG).show();
switch (position) {
case 0:
textView1.setText("TextView - 1.0"); // TextView - 1, position - 0
textView2.setText("TextView - 2.0"); // TextView - 2, position - 0
break;
case 1:
textView1.setText("TextView - 1.1");
textView2.setText("TextView - 2.1");
break;
case 2:
textView1.setText("TextView - 1.2");
textView2.setText("TextView - 2.2");
break;
case 3:
textView1.setText("TextView - 1.3");
textView2.setText("TextView - 2.3");
break;
case 4:
textView1.setText("TextView - 1.4");
textView2.setText("TextView - 2.4");
break;
default:
break;
}
}
/* If your min SDK version is < 8 you need to trigger the onConfigurationChanged in ViewFlow manually, like this */
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
viewFlow.onConfigurationChanged(newConfig);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.indianic.viewflipperdemo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.indianic.viewflipperdemo.widget.ViewFlow
android:id="@+id/viewflow"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:sidebuffer="3" >
</com.indianic.viewflipperdemo.widget.ViewFlow>
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/textView2"
android:layout_centerHorizontal="true"
android:text="Remember Life"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/viewflowindic"
android:layout_centerHorizontal="true"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:padding="5dp"
android:text="Instantly search memories of friends, season, birthdays, and more"
android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="10dp" >
<Button
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="left|center"
android:layout_weight="1"
android:text="Register"
android:textColor="#000000" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="1"
android:text="Login"
android:textColor="#000000" />
</LinearLayout>
<com.indianic.viewflipperdemo.widget.CircleFlowIndicator
android:id="@+id/viewflowindic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout1"
android:layout_centerHorizontal="true"
android:padding="20dp"
app:inactiveType="stroke" />
</RelativeLayout>
XML:-
public class MainActivity extends Activity {
private ViewFlow viewFlow;
TextView textView1, textView2;
int position = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.circle_title);
setContentView(R.layout.screen_layout);
viewFlow = (ViewFlow) findViewById(R.id.viewflow);
viewFlow.setAdapter(new ImageAdapter(this), 1); // default focus on second circle
CircleFlowIndicator indic = (CircleFlowIndicator) findViewById(R.id.viewflowindic);
viewFlow.setFlowIndicator(indic);
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
position = viewFlow.getPositionForView(indic);
Toast.makeText(MainActivity.this, position, Toast.LENGTH_LONG).show();
switch (position) {
case 0:
textView1.setText("TextView - 1.0"); // TextView - 1, position - 0
textView2.setText("TextView - 2.0"); // TextView - 2, position - 0
break;
case 1:
textView1.setText("TextView - 1.1");
textView2.setText("TextView - 2.1");
break;
case 2:
textView1.setText("TextView - 1.2");
textView2.setText("TextView - 2.2");
break;
case 3:
textView1.setText("TextView - 1.3");
textView2.setText("TextView - 2.3");
break;
case 4:
textView1.setText("TextView - 1.4");
textView2.setText("TextView - 2.4");
break;
default:
break;
}
}
/* If your min SDK version is < 8 you need to trigger the onConfigurationChanged in ViewFlow manually, like this */
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
viewFlow.onConfigurationChanged(newConfig);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.indianic.viewflipperdemo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.indianic.viewflipperdemo.widget.ViewFlow
android:id="@+id/viewflow"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:sidebuffer="3" >
</com.indianic.viewflipperdemo.widget.ViewFlow>
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/textView2"
android:layout_centerHorizontal="true"
android:text="Remember Life"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/viewflowindic"
android:layout_centerHorizontal="true"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:padding="5dp"
android:text="Instantly search memories of friends, season, birthdays, and more"
android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="10dp" >
<Button
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="left|center"
android:layout_weight="1"
android:text="Register"
android:textColor="#000000" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="1"
android:text="Login"
android:textColor="#000000" />
</LinearLayout>
<com.indianic.viewflipperdemo.widget.CircleFlowIndicator
android:id="@+id/viewflowindic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout1"
android:layout_centerHorizontal="true"
android:padding="20dp"
app:inactiveType="stroke" />
</RelativeLayout>
异常原因:
您在onCreate方法中添加了用于更改文本的开关大小写。这是不正确的。用户输入应由处理
解决方案:
将侦听器添加到视图中。
当浏览视图时,侦听器将处理事件并根据位置更改文本
在视图中添加一个setOnViewSwitchListener,并覆盖onSwitched方法
示例代码:
参考资料:
-
您问题的解决方案---
在这里,您可以根据页面位置查找并自定义视图
MainActivity.Java
package com.example.circleindicatordemo;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnClickListener;
import com.viewpagerindicator.CirclePageIndicator;
public class MainActivity extends FragmentActivity implements OnClickListener {
MyAdapter mAdapter;
ViewPager mPager;
private CirclePageIndicator mIndicator;
private static ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arrayList = new ArrayList<String>();
arrayList.add("Page1");
arrayList.add("Page2");
arrayList.add("Page3");
arrayList.add("Page4");
arrayList.add("Page5");
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Fragment getItem(int position) {
return MyFragment.init(position, arrayList);
}
}
@Override
public void onClick(View v) {
}
}
package com.example.circleindicatordemo;
导入java.util.ArrayList;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentActivity;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentPagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.view.view;
导入android.view.view.OnClickListener;
导入com.viewpagerindicator.CirclePageIndicator;
公共类MainActivity扩展FragmentActivity实现OnClickListener{
MyAdapter mAdapter;
可视寻呼机;
专用环路指示器;
私有静态ArrayList ArrayList;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arrayList=新的arrayList();
arrayList.add(“第1页”);
arrayList.add(“第2页”);
arrayList.添加(“第3页”);
arrayList.add(“第4页”);
arrayList.添加(“第5页”);
mAdapter=新的MyAdapter(getSupportFragmentManager());
mPager=(ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mIndicator=(CirclePageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
}
公共静态类MyAdapter扩展了FragmentPagerAdapter{
公共MyAdapter(碎片管理器碎片管理器){
超级(碎片管理器);
}
@凌驾
public int getCount(){
返回arrayList.size();
}
@凌驾
公共片段getItem(int位置){
返回MyFragment.init(位置,arrayList);
}
}
@凌驾
公共void onClick(视图v){
}
}
Java--
package com.example.circleindicatordemo;
导入java.util.ArrayList;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MyFragment扩展了片段实现OnClickListener{
内部位置;
私有ArrayList ArrayList;
私有文本视图tv_名称;
私人影像查看iv_影像;
静态MyFragment init(int位置,ArrayList ArrayList){
MyFragment giftFragment=新的MyFragment();
Bundle args=新Bundle();
参数putInt(“位置”,位置);
args.putSerializable(“数据”,arrayList);
giftFragment.setArguments(args);
返回礼物碎片;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
position=getArguments().getInt(“position”);
arrayList=(arrayList)getArguments().getSerializable(“数据”);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.my_碎片,容器,假);
tv_name=(TextView)view.findViewById(R.id.tv_name);
iv_image=(ImageView)view.findViewById(R.id.iv_image);
tv_name.setText(arrayList.get(position));
返回视图;
}
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
}
}
您还可以查看上述代码的完整源代码CircleviewLipperActivity.onCreate(CircleviewLipperActivity.java:35)position=viewFlow.getPositionForView(Indi);非常感谢:)我接受了您的回答,并将根据so规则在未来23小时内给您奖金
package com.example.circleindicatordemo;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class MyFragment extends Fragment implements OnClickListener {
int position;
private ArrayList<String> arrayList;
private TextView tv_name;
private ImageView iv_image;
static MyFragment init(int position, ArrayList<String> arrayList) {
MyFragment giftFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("position", position);
args.putSerializable("data", arrayList);
giftFragment.setArguments(args);
return giftFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
position = getArguments().getInt("position");
arrayList = (ArrayList<String>) getArguments().getSerializable("data");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
tv_name = (TextView) view.findViewById(R.id.tv_name);
iv_image = (ImageView) view.findViewById(R.id.iv_image);
tv_name.setText(arrayList.get(position));
return view;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
}