通过界面更新/设置文本
Posted
技术标签:
【中文标题】通过界面更新/设置文本【英文标题】:Update/set text through interface 【发布时间】:2017-11-03 14:10:41 【问题描述】:我正在尝试在我的 MainActivity 选项卡上的文本视图中设置通知的数量/计数。我已经通过使用接口成功地获取了我的片段和活动之间的数据。每次我收到通知时,它都会将号码传递给我的 MainActivity。我可以显示数字,但我不知道如何在我的 textview 上实现和设置。
public void onDataPass(String data) Log.d("LOG","你好" + 数据);
我能够从上面的代码中获得价值。下面是我的日志:
06-02 07:02:16.213 12310-12310/ D/LOG: hello 通知数:1
06-02 07:03:26.697 12310-12310/ D/LOG: hello 通知数量:2
06-02 07:04:35.718 12310-12310 D/LOG: hello 通知数量:3
但是,我试图在我的 textview 上设置这个数字。即使在将我的“数据”声明为公开之后,我也会得到空值。我不确定如何将数据的值放入 textview 中。有人可以帮我解决这个问题吗?
if(tab != null && tab.getCustomView() != null) TextView b = (TextView) tab.getCustomView().findViewById(R.id.badge); if (b != null) b.setText(data); Log.d("hello1", "test1" + data);
以下是我的完整 MainActivity 代码: MainActivity.java
public class MainActivity extends AppCompatActivity implements NotificationFragment.OnDataPass
public String data;
private String name;
private String email;
private TextView badgeText;
public void onDataPass(String data)
Log.d("LOG","hello " + data);
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setContentView(R.layout.menu_actionbar_tab);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
ab.setTitle("Test");
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
if (viewPager != null)
setupViewPager(viewPager);
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
final int[] tabIcon = new int[]
R.drawable.tab_item_remit_state,
R.drawable.tab_item_account_state,
R.drawable.tab_item_notification,
;
tabLayout.getTabAt(0).setIcon(tabIcon[0]);
tabLayout.getTabAt(1).setIcon(tabIcon[1]);
tabLayout.getTabAt(2).setIcon(tabIcon[2]);
TabLayout.Tab tab = tabLayout.getTabAt(2);
tab.setCustomView(R.layout.badged_tab);
if(tab != null && tab.getCustomView() != null)
TextView b = (TextView) tab.getCustomView().findViewById(R.id.badge);
if (b != null)
b.setText(data);
Log.d("hello1", "test1" + data);
final View v = tab.getCustomView().findViewById(R.id.badgeCotainer);
View a = tab.getCustomView();
a.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View a, MotionEvent event)
v.setVisibility(View.INVISIBLE);
return false;
);
if (v != null )
v.setVisibility(View.VISIBLE);
【问题讨论】:
有几件事,在 onDataPass() 函数中看不到将数据分配给活动的类级别变量的部分,您只是在记录吗?另外我认为当 onCreate 方法被调用时,数据不会出现在活动的类级别数据变量中。您可能需要手动调用将在 onDataPass() 函数中设置选项卡文本值的函数。 @SAJ 是的,我只是在记录。如何在我的 onCreate 中调用 onDataPass 方法?或者如果我在 onDataPass 方法下设置文本是否有可能?我只登录 onDataPass 因为我的标签是 onCreate 。 是的,您需要在 onDataPass 方法中添加 setTabText 逻辑。你不应该调用 onCreate 方法。将选项卡文本逻辑提取到一个单独的函数中,该函数设置并从 onDataPass 调用该函数。 谢谢!我将尝试在我的 onDataPass 方法上实现 setText on tab 逻辑。 【参考方案1】:创建界面
public interface OnDataReceiverListener
void onDataReceived(String myData);
在类中声明接口,您可以在其中获取需要在其他活动中传递的数据并为此创建设置器...假设类名称为 MyReceiver.java
private static OnDataReceiverListener onDataReceiveListener;
public static void setOnDataReceiveListener(OnDataReceiverListener _listener)
onDataReceiveListener = _listener;
在 Activity 的 onCreate()
中调用这个 setter,假设 MainActivity
MyReceiver.setOnDataReceiveListener(this);
// This will overided
@Override
public void onDataReceived(String myData)
// Process your data
TextView b = (TextView) mTabLayout .getTabAt(2).getCustomView().findViewById(R.id.badge);
if (b != null)
b.setText(myData);
不要忘记将 setter 设置为 null
,因为接口是静态的。在onDestroy()
做这个工作
public void onDestroy()
MyReceiver.setOnDataReceiveListener(null);
super.onDestroy();
总结,
将mTabLayout
声明为全局实例,在onDataReceived
回调中设置标记文本。
【讨论】:
感谢您提供接口示例。实际上,我已经在使用 Interface 来传递数据,并且我也能够获取数据。我只是想在选项卡上的 textview 上设置数据,但我不知道如何在我的 onDatapass 方法上调用选项卡,因为选项卡是 onCreate。我正在尝试在 onDatapass 方法下实现逻辑。我做的另一种方法是设置数据 onCreate 但不知道如何在 onCreate 中调用该方法。抱歉,如果我的问题让您感到困惑。以上是关于通过界面更新/设置文本的主要内容,如果未能解决你的问题,请参考以下文章